Outlook 2007从C#访问时出现COM异常,TYPE_E_LIBNOTREGISTERED。

9
我正在尝试编写一个程序,可以打开新的Outlook 2007邮件。
我已经从COM选项卡中引用了Microsoft Outlook 12.0 ObjectLibrary。
在VS中,这些项显示在引用中:
Microsoft.Office.Core
Microsoft.Office.Inerop.Outlook

现在我尝试调用以下代码:
var _outlookInstance = new Microsoft.Office.Interop.Outlook.Application();
var _message = (OutlookApp.MailItem)_outlookInstance.CreateItem(OutlookApp.OlItemType.olMailItem);

其中OutlookApp==Microsoft.Office.Interop.Outlook命名空间。

在调用清单的第二行时,我一直收到这个异常:(InvalidCastException)

无法将类型为“Microsoft.Office.Interop.Outlook.ApplicationClass”的COM对象转换为类型“Microsoft.Office.Interop.Outlook._Application”的接口类型。这是因为对IID为“{00063001-0000-0000-C000-000000000046}”的接口的COM组件上的QueryInterface调用失败,原因是库未注册。(来自HRESULT的异常:0x8002801D(TYPE_E_LIBNOTREGISTERED))。

在我的其他电脑上,该代码适用于Outlook 2003。

如果有任何解决方法,请告诉我,谢谢。

4个回答

10

3
太棒了!删除“HKEY_CLASSES_ROOT\TypeLib{00062FFF-0000-0000-C000-000000000046}\9.5”解决了问题!这是 Office 2013 卸载程序 的一个错误。 - SliverNinja - MSFT
1
很好的发现,解决了我的问题 +1 - Gabe
这对我没有起作用,因为没有过量的9.5字段。 在我的情况下,问题在于当我降级到Outlook 2010时,我修改了安装位置(即不在默认的ProgramFiles文件夹中)。 然而,Windows没有相应地更新'HKEY_CLASSES_ROOT \ TypeLib \ {00062FFF-0000-0000-C000-000000000046} \ 9.4 \ 0 \ win64'中的值。 手动更新该值并将其指向正确的位置后,问题得以解决。 - Doigen

5

该计算机上未正确安装Office。您可以使用Regedit.exe验证,导航到HKEY_CLASSES_ROOT\Interface\{00063001-0000-0000-C000-000000000046}\TypeLib以验证类型库GUID(应为{00062FFF-0000-0000-C000-000000000046}),然后导航到HKEY_CLASSES_ROOT\TypeLib\{00062FFF-0000-0000-C000-000000000046}以验证类型库是否已正确注册,并使用正确的类型库版本号。 后者应该是问题所在。

如果目标计算机运行64位Windows版本,请尝试将项目+属性、生成、平台目标设置为x86。


在Windows x64上,了解WOW64注册表(http://support.microsoft.com/kb/896459)。 - Lex Li
@nobugz:关于第二步:当我导航到该位置时,存储在其中的值显示为“未设置值”。这是个问题吗?它应该设置为特定的值吗?如果是,那么应该有什么值。在HKEY_CLASSES_ROOT\TypeLib{00062FFF-0000-0000-C000-000000000046}的子节点中,我也有一些空值。它们应该被设置吗? - PK.
嗯,这就解释了为什么它不起作用。不知道发生了什么事,可以追踪“未正确安装”的问题。也许你的注册表出了问题,试试在另一台机器上运行它。 - Hans Passant
1
原来对我来说是构建平台。谢谢! - shookdiesel

1
如果您尝试从Visual Studio访问Outlook并出现以下错误: TF400424:无法发送到Microsoft Outlook:无法将类型为'Microsoft.Office.Interop.Outlook.ApplicationClass'的COM对象转换为接口类型'Microsoft.Office.Interop.Outlook._Application'。由于查询接口调用COM组件上的IID '{00063001-0000-0000-C000-000000000046}'的接口失败,因此此操作失败,原因是以下错误:库未注册。(HRESULT的异常值为0x8002801D(TYPE_E_LIBNOTREGISTERED))。 请执行以下操作: 1.使用注册表导航到:HKEY_CLASSES_ROOT\TypeLib{00062FFF-0000-0000-C000-000000000046} 2.删除版本表中未安装在您的系统上的任何Outlook版本的版本键(例如9.5)。例如,如果您不使用Outlook 2013,则删除“9.5”条目。如果您不使用Outlook 2010,则删除“9.4”条目。不要删除在“步骤#1”中配置的版本的条目。

Outlook 2007 ==> 9.3

Outlook 2010 ==> 9.4

Outlook 2013 ==> 9.5

这段内容是关于Outlook版本号的对应说明。

enter image description here


参考文献: https://support.netdocuments.com/hc/zh-cn/articles/205219170-EMS-%E4%BD%BF%E7%94%A8-Outlook-%E6%97%B6%E5%87%BA%E7%8E%B0-Library-Not-Registered-%E9%94%99%E8%AF%AF


0

以下代码也遇到了同样的问题:

Dim OutlookMessage As Outlook.MailItem
Dim AppOutlook As New Outlook.Application
OutlookMessage = AppOutlook.CreateItem(Outlook.OlItemType.olMailItem)

将第一行替换为以下内容,问题得到解决。

 Dim OutlookMessage As Object

(VB中的示例,但同样适用于C#)


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