我如何修复"无法转换类型为' Microsoft.Office.Interop.Outlook.ApplicationClass'的COM对象? / RPC服务器不可用"?

时间:2017-02-08 16:31:19

标签: c# office-interop assemblies com-interop comobject

我遇到上述错误,在特定计算机上运行时会暂停我的应用中的活动。当我在自己的机器上运行它时,不会发生这样的错误。

也许" RPC服务器不可用"这是问题的症结所在,但是在应用程序之前工作(并且仍在我的机器上工作)之后会出现什么原因?

错误消息,在更多上下文中(显示似乎有价值/导入的内容)是:

  

System.InvalidCastException:无法转换类型为' Microsoft.Office.Interop.Outlook.ApplicationClass'的COM对象。到界面类型' Microsoft.Office.Interop.Outlook._Application'。此操作失败,因为QueryInterface调用COM组件上的接口与IID' {00063001-0000-0000-C000-000000000046}'由于以下错误而失败:RPC服务器不可用。 (来自HRESULT的异常:0x800706BA)。          在System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc,IntPtr pCPCMD,IntPtr& ppTarget,Boolean& pfNeedsRelease)          在Microsoft.Office.Interop.Outlook.ApplicationClass.CreateItem(OlItemType ItemType)          在RoboReporter2017.ExceptionLoggingService.EmailMessageToAssignee(String unit,String notificationRecipient,String rptName)          在RoboReporter2017.RoboRprtrLib.GenerateAndSaveDueReports()          在RoboReporter2017.FormMain.RunDueReports()          在RoboReporter2017.FormMain.FormMain_Load(对象发件人,EventArgs e)       。 。

     

**************已装载的装配**************       ----------------------------------------       Microsoft.Office.Interop.Outlook           汇编版本:12.0.0.0           Win32版本:12.0.4518.1014           CodeBase: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           CodeBase:file:/// C:/Windows/assembly/GAC/office/12.0.0.0__71e9bce111e9429c/office.dll       ----------------------------------------

在err msg中引用的那台机器上的破解方法是:

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();
}

我注意到我项目参考中的Microsoft.Office.Interop.Outlook版本是12.0.0.0,与#34; Loaded Assemblies&#34;中列出的版本相同。在错误信息中列出。

更新

考虑到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();
}

...改编自here,但在实施之前,我关闭了Outlook并运行了应用程序,看看如果Outlook没有运行,我是否会在我的机器上获得相同的错误信息。但不是!它自动重新启动Outlook,而不需要我的fancy-pants StartOutlookIfNotRunning()方法。

所以这不是问题,无论如何......

2 个答案:

答案 0 :(得分:1)

请参阅FIX: Error message when you run an application that makes "burst load" style activation requests and calls a server component through DCOM: "0x800706ba" or "0x800706bf"

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

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

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。请在Considerations for server-side Automation of Office文章中详细了解相关内容。

答案 1 :(得分:1)

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

System.InvalidCastException:无法将类型为“ Microsoft.Office.Interop.Outlook.ApplicationClass”的COM对象转换为接口类型为“ Microsoft.Office.Interop.Outlook._Application”。

我在another forum中用Eugene Astafiev的建议解决了这个问题:

regtlib msoutl.olb

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

对我来说,捕获器在某些机器上正确运行,而在另一台机器上却不工作。