C# “我怎样才能解决问题?”;无法强制转换类型为';Microsoft.Office.Interop.Outlook.ApplicationClass';/RPC服务器不可用";?

C# “我怎样才能解决问题?”;无法强制转换类型为';Microsoft.Office.Interop.Outlook.ApplicationClass';/RPC服务器不可用";?,c#,office-interop,assemblies,com-interop,comobject,C#,Office Interop,Assemblies,Com Interop,Comobject,我得到了上面的错误,当在特定机器上运行时,它会暂停我的应用程序中的活动。当我在自己的机器上运行它时,不会发生这样的错误 也许“RPC服务器不可用”是问题的症结所在,但在应用程序之前工作(并且仍在我的机器上工作)之后,是什么导致该问题弹出 在更多上下文中(显示似乎有价值/重要的内容),err msg是: System.InvalidCastException:无法将类型为“Microsoft.Office.Interop.Outlook.ApplicationClass”的COM对象强制转换为接口

我得到了上面的错误,当在特定机器上运行时,它会暂停我的应用程序中的活动。当我在自己的机器上运行它时,不会发生这样的错误

也许“RPC服务器不可用”是问题的症结所在,但在应用程序之前工作(并且仍在我的机器上工作)之后,是什么导致该问题弹出

在更多上下文中(显示似乎有价值/重要的内容),err msg是:

System.InvalidCastException:无法将类型为“Microsoft.Office.Interop.Outlook.ApplicationClass”的COM对象强制转换为接口类型“Microsoft.Office.Interop.Outlook.\u应用程序”。此操作失败,因为对IID为“{00063001-0000-0000-C000-0000000000 46}”的接口的COM组件的QueryInterface调用由于以下错误而失败:RPC服务器不可用。(HRESULT的异常:0x800706BA)。 位于System.StubHelpers.StubHelpers.GetCOMIPFromRCW(对象objSrc、IntPtr pCPCMD、IntPtr和ppTarget、布尔值和pfNeedsRelease) 位于Microsoft.Office.Interop.Outlook.ApplicationClass.CreateItem(OlItemType ItemType) 位于RoboReporter2017.ExceptionLoggingService.EmailMessageToAssignee(字符串单位,字符串通知收件人,字符串名称) 在RoboReporter2017.RoboRprtrLib.GenerateAndSaveDueReports()上 在RoboReporter2017.FormMain.RunDueReports()上 在RoboReporter2017.FormMain.FormMain_加载时(对象发送方,事件参数e) . . .

**************加载的程序集************** ---------------------------------------- Microsoft.Office.Interop.Outlook 程序集版本:12.0.0.0 Win32版本:12.0.4518.1014 代码库:file:///C:/Windows/assembly/GAC/Microsoft.Office.Interop.Outlook/12.0.0.0__71e9bce111e9429c/Microsoft.Office.Interop.Outlook.dll ---------------------------------------- 办公室 程序集版本:12.0.0.0 Win32版本:12.0.4518.1014 代码库:file:///C:/Windows/assembly/GAC/office/12.0.0.0__71e9bce111e9429c/office.dll ----------------------------------------

错误消息中引用的在该机器上中断的方法是:

internal static void EmailMessageToAssignee(string unit, string notificationRecipient, string rptName)
{
    string saveLocation = @"\\storageblade\cs\REPORTING\RoboReporter";
    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();
}
…改编自,但在实施之前,我关闭了Outlook并运行了该应用程序,以查看如果Outlook未运行,我是否会在我的计算机上收到相同的错误消息。但是没有!它自己重新启动Outlook,而不需要我的StartOutlookIfNotRunning()方法

所以这不是问题所在…

请参阅

您在何时何地尝试自动化Outlook

Microsoft目前不建议也不支持从任何无人参与、非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在该环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁

如果您正在构建一个在服务器端上下文中运行的解决方案,那么您应该尝试使用安全的组件来无人值守地执行。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方案。如果使用服务器端解决方案中的Office应用程序,该应用程序将缺少许多成功运行所需的功能。此外,您将面临整体解决方案稳定性方面的风险。在文章中阅读更多关于这方面的内容

您在何时何地尝试自动化Outlook

Microsoft目前不建议也不支持从任何无人参与、非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在该环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁


如果您正在构建一个在服务器端上下文中运行的解决方案,那么您应该尝试使用安全的组件来无人值守地执行。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方案。如果使用服务器端解决方案中的Office应用程序,该应用程序将缺少许多成功运行所需的功能。此外,您将面临整体解决方案稳定性方面的风险。在文章中阅读更多关于这方面的内容

虽然尤金·阿斯塔菲夫的建议非常合理,但我曾两次与不祥的预言相撞

System.InvalidCastException:无法将类型为“Microsoft.Office.Interop.Outlook.ApplicationClass”的COM对象强制转换为接口类型“Microsoft.Office.Interop.Outlook.\u应用程序”

我用尤金·阿斯塔菲夫的建议解决了这个问题:

regtlib msoutl.olb

从Office App文件夹内的提升命令提示符


对我来说,捕获物在某些机器上正常工作,而在另一台机器上不工作。

好吧,尽管尤金·阿斯塔菲耶夫的建议非常合理,但我两次与不祥的机器相撞

System.InvalidCastException:无法将类型为“Microsoft.Office.Interop.Outlook.ApplicationClass”的COM对象强制转换为接口类型“Microsoft.Office.Interop.Outlook.\u应用程序”

我用尤金·阿斯塔菲夫的建议解决了这个问题:

regtlib msoutl.olb

从Office App文件夹内的提升命令提示符


对我来说,catch在某些机器上正常工作,而在另一台机器上不正常工作。

是的,Outlook 2007安装在那里(与我的机器上相同);但它可能没有运行…是的,Outlook 2007安装在那里(与我的机器上的相同);但它可能没有运行……当某个进程运行时,我的帖子中显示的电子邮件代码会在循环中触发。由于Outlook是我们使用的电子邮件引擎,我必须“自动化”它,而不是通过其他服务发送电子邮件
private static void StartOutlookIfNotRunning()
{
    string OutlookFilepath = @"C:\Program Files (x86)\Microsoft 
Office\Office12\OUTLOOK.EXE";
    if (Process.GetProcessesByName("OUTLOOK").Count() > 0) return;
    Process process = new Process();
    process.StartInfo = new ProcessStartInfo(OutlookFilepath);
    process.Start();
}