我收到了上面的错误,当在特定的机器上运行时,它会挂起我的应用程序中的活动。当我在自己的机器上运行它时,不会发生这样的错误。
也许">RPC服务器不可用"是问题的症结所在,但是什么原因导致该应用程序之前工作(并且仍在我的机器上工作)后弹出?
在更多上下文中(显示似乎有价值/导入的内容),错误消息是:
系统。InvalidCastException:无法强制转换"Microsoft"类型的COM对象。办公室Interop。见解ApplicationClass"到接口类型"Microsoft。办公室Interop。Outlook_应用程序"。此操作失败,因为对IID为"{00063001-0000-0000-C000-000000000046}"的接口的COM组件的QueryInterface调用由于以下错误而失败:RPC服务器不可用。(HRESULT中出现异常:0x800706BA)。在系统中。StubHelpers。StubHelpers。GetCOMIPFromRCW(对象objSrc、IntPtr-pCPCMD、IntPtr&ppTarget、布尔值&pfNeedsRelease)在微软。办公室Interop。见解ApplicationClass。CreateItem(OlItemType ItemType)在RoboReporter2017.ExceptionLoggingService.EmailMessageToAssignee(字符串单元,字符串notificationRecipient,字符串rptName)在RoboReporter2017.RobRprtrLib.GenerateAndSaveDueReports()在RoboReporter2017.FormMain.RunDueReports()在RoboReporter2017.FormMain.FormMain_Load(对象发送方,EventArgs e)…
**************已加载的程序集**************----------------------------------------微软办公室Interop。见解程序集版本:12.0.0.0Win32版本:12.0.4518.1014CodeBase:文件:///C:/Windows/assembly/GAC/Microsoft。办公室Interop。Outlook/12.0.0.0__71e9cce111e9429c/Microsoft.Office.Interop.Outlook.dll----------------------------------------办公室程序集版本:12.0.0.0Win32版本:12.0.4518.1014代码库:file:///C:/Windows/assembly/GAC/office/12.0.0.0__71e9cce111e9429c/office.dll----------------------------------------
错误消息中引用的在该机器上中断的方法是:
internal static void EmailMessageToAssignee(string unit, string notificationRecipient, string rptName)
{
string saveLocation = @"\storagebladecsREPORTINGRoboReporter";
var subject = string.Format("Your {0} report for {1} generated by Robo Reporter 2017", rptName, unit);
var body = string.Format("Your {0} report for {1} was generated by Robo Reporter 2017 and can be found in the usual location in the shared network folder ({2})", rptName, unit, saveLocation);
Application app = new Application();
MailItem mailItem = app.CreateItem(OlItemType.olMailItem);
mailItem.To = notificationRecipient;
mailItem.Subject = subject;
mailItem.HTMLBody = string.Format(@"<html><body><img src='http://www.proactusa.com/bla/images/pa_logo_notag.png' alt='Platypus logo' width='199' height='130' ><p>{0}</p></body></html>", body);
mailItem.Importance = OlImportance.olImportanceNormal;
mailItem.Display(false);
mailItem.Send();
}
我注意到微软。办公室Interop。我的项目引用中的Outlook版本是12.0.0.0,与错误消息中列出的"已加载的程序集"中列出的版本相同。
更新
我想也许Outlook没有运行是问题所在,我写了这样的代码:
private static void StartOutlookIfNotRunning()
{
string OutlookFilepath = @"C:Program Files (x86)Microsoft
OfficeOffice12OUTLOOK.EXE";
if (Process.GetProcessesByName("OUTLOOK").Count() > 0) return;
Process process = new Process();
process.StartInfo = new ProcessStartInfo(OutlookFilepath);
process.Start();
}
从这里改编,但在实现它之前,我关闭了Outlook并运行了该应用程序,看看如果Outlook不运行,我是否会在我的机器上收到同样的错误消息。但是没有!它自己重新启动Outlook,而不需要我花哨的StartOutlookIfNotRunning()方法。
所以这不是问题,无论如何。。。
请参阅FIX:运行发出"突发加载"式激活请求并通过DCOM调用服务器组件的应用程序时的错误消息:"0x800706ba"或"0x800708bf"。
您在何时何地尝试自动化Outlook?
Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在这种环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁。
如果您正在构建一个在服务器端上下文中运行的解决方案,则应该尝试使用那些可以安全执行无人参与的组件。或者,您应该尝试找到至少允许部分代码运行客户端的替代方案。如果使用服务器端解决方案中的Office应用程序,则该应用程序将缺乏成功运行所需的许多功能。此外,您将在整体解决方案的稳定性方面承担风险。请参阅"Office服务器端自动化的注意事项"一文中的更多内容。
好吧,尽管尤金·阿斯塔菲耶夫的建议非常合理,但在两次我与不祥的相撞时
系统。InvalidCastException:无法强制转换"Microsoft"类型的COM对象。办公室Interop。见解ApplicationClass"到接口类型"Microsoft。办公室Interop。Outlook_应用程序"。
我在另一个论坛上用尤金·阿斯塔菲耶夫的建议解决了这个问题:
regtlib msoutl.olb
从Office App文件夹内的提升命令提示符。
对我来说,这个陷阱在一些机器中正确工作,而在另一台机器中却不工作。