为什么我从Office的Outlook库收到异常?

39

我有一个应用程序调用

Email hello = new Email(appropriate constructor);
hello.Email_Send();

我遇到了这个异常:

检索具有 CLSID {0006F03A-0000-0000-C000-000000000046} 的组件的 COM 类工厂失败,原因是出现以下错误: 80080005 服务器执行失败 (来自 HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE))。

该异常来自于 System.Runtime.InteropServices.COMException

using O = Microsoft.Office.Interop.Outlook;    
class Email
{
    public void Email_Send()
    {
        O.Application outlook = new O.Application(); //Exception thrown here.
        O.MailItem message = outlook.CreateItem(O.OlItemType.olMailItem);
        message.To = Receiver;
        message.CC = Sender;
        message.Subject = Subject;
        message.Body = "This is an automated message sent at " + DateTime.Now.ToString("HH:mm:ss") + " about " + Body_Topic + System.Environment.NewLine + Body_Content ;
        message.Send();
    }
}

这个错误之前从未发生过,而且我所知道的代码也没有做出任何更改。http://support.microsoft.com/kb/825118似乎与我的症状不符——我的电脑没有停止响应等等。非常感谢任何诊断问题的帮助!


6
这个错误是由于以管理员身份运行Visual Studio所致。Outlook不允许不同的用户访问同一个邮箱(我在桌面上打开了Outlook应用程序)。尽管我使用我的域用户具有本地管理员访问权限,但以管理员身份运行VS必须将进程关联到不同的用户对象?虽然不确定其工作原理,但问题已解决。 - Zee
请将您的评论发布为答案,以便其他人受益。 - SliverNinja - MSFT
这个回答解决了你的问题吗?Outlook COMException - James John McGuire 'Jahmic'
5个回答

99

这个错误是由于以管理员身份运行Visual Studio引起的。Outlook不允许不同用户访问同一个邮箱(我在桌面上打开了Outlook应用程序)。尽管我使用域用户具有本地管理员访问权限,但以管理员身份运行VS必须将进程关联到另一个用户对象?不确定它是如何工作的,但问题已得到解决。


无法将类型为“System.__ComObject”的COM对象转换为接口类型“Microsoft.Office.Interop.Outlook.Application”。此操作失败,因为针对IID“{00063001-0000-0000-C000-000000000046}”的COM组件上的QueryInterface调用失败,原因是以下错误:库未注册。(HRESULT异常:0x8002801D(TYPE_E_LIBNOTREGISTERED))。 - Meer
3
当我们关闭正在运行的Outlook实例时,它工作得很好。现在的问题是,我想这个问题需要在另一个Stack Overflow问题中提出,就是如何使它即使Outlook正在运行也可以正常工作。 - Marc Roussel
我有同样的问题。但它出现在Windows服务中,我尝试使用Outlook COM。 - Rauf
我在我的PowerShell脚本中遇到了这个问题。我的问题通过这个解决方案得到了解决。因为我以管理员模式打开了PowerShell脚本。 - Maximious

5

我曾经遇到过同样的问题,正如之前所说:如果Visual Studio以管理员身份运行,则Outlook会阻止具有不同用户的另一个实例。我的VS解决方案正在启动几个项目,并且我需要它以管理员身份运行,因此在调试时我会将Outlook作为管理员运行。这解决了我的问题。


1
暂时以管理员身份运行Outlook可能是可以的。然而,总是以管理员身份运行Outlook可能不是一个好主意。如果您收到了某种恶意电子邮件/附件,利用了Outlook中的漏洞,那么您可能会授予攻击者管理员权限,而不是在您的计算机上较低的权限级别。 - Zee

0

将其中一个评论贴为答案。

当我们关闭正在运行的 Outlook 实例时,它就像魔术一样运行良好。

在我的情况下,我正在使用特殊安全软件的 VM 上运行。在我的开发人员桌面上,当 Outlook 打开时它可以正常工作。

但是在我的安全 VM 中,我必须关闭 Outlook 才能使其正常工作。这很可能是由于我们的安全软件导致的。

当 Outlook 运行时:Unhandled Exception: System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

当它未运行时,它可以正常工作。


0

被接受的答案并不完全准确。实际上,如果调用应用程序与原始进程没有相同的访问级别,则 COM 将失败。两者需要处于相同的访问级别。

因此,如果 Outlook 以管理员身份启动,并且在 Visual Studio 中调试的程序也是管理员,则它将正常工作。

反之亦然:如果 Outlook 没有以管理员身份启动,则在 Visual Studio 中调试的程序也需要是非管理员。

此外,如果没有同时包含对 Microsoft.Office.Core 的 COMReference,则可能会收到此消息。


0
发生在我身上的事情,即使 Visual Studio 已关闭也会发生。 我相信这是因为 Outlook 仍在运行。
我通过使用一个批处理文件来解决它,它会在运行 exe 之前关闭 Outlook:
taskkill /F /im outlook.exe
sleep 5

C:\Project\RunProcess.exe

此外,在任务计划程序(设置选项卡)中,我勾选了“如果运行的任务在请求时不结束,则强制停止它”。
这对我起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接