【问题标题】:.NET RTD/COM Excel Interop errors on one user's machine?一台用户机器上的 .NET RTD/COM Excel 互操作错误?
【发布时间】:2012-04-29 07:39:53
【问题描述】:

我们构建了一个已经使用多年的 .NET COM/Excel RTD 服务器(.NET 程序集),在各种机器上运行(即我们知道它可以工作,并且我们的标准安装方法也可以工作)。我们有一个用户在另一台机器上安装了这个 RTD 组件,并且在让它顺利运行时遇到了问题。我相信这个问题与 Interop.Microsoft.Office.Interop.Excel.dll 与这台机器不兼容,或者注册不正确有关。以下是具体细节:

虽然 RTD 链接在一定程度上可以正常工作,但我们的应用程序经常记录此错误:

RTDServer.NotifyExcel(): Error notifying Excel, ex=System.InvalidCastException: 
Unable to cast COM object of type 'System.__ComObject' to interface type 
'Microsoft.Office.Interop.Excel.IRTDUpdateEvent'. This operation failed because 
the QueryInterface call on the COM component for the interface with 
IID '{A43788C1-D91B-11D3-8F39-00C04F3651B8}' failed due to the following error: 
Library not registered. (Exception from HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED)).     
 at Microsoft.Office.Interop.Excel.IRTDUpdateEvent.UpdateNotify()     
 at EZomsRTDServer.RTDServer.NotifyExcel()

当我在用户机器上进行故障排除时,我检查了我们的组件是否在 COM 中正确注册。我们运行这个命令来向 COM 注册我们的组件:

C:\EZomsRTD\regasm EZomsRTDServer.dll /codebase "c:\EZomsRTD\EZomsRTDServer.dll"
C:\EZomsRTD\regasm EZomsRTDServer.dll /tlb

在用户的机器上运行这些命令会产生这个 regasm 错误:

Type library exporter warning: Referenced type is defined 
in managed component, which is imported from a type library 
that could not be loaded because it was not registered 
(type: 'Microsoft.Office.Interop.Excel.IRtdServer'; component: 
'C:\EZomsRTD\Interop.Microsoft.Office.Interop.Excel.dll').  
Assembly exported to 'C:\EZomsRTD\EZomsRTDServer.tlb', and the type 
library was registered successfully

(文件:Interop.Microsoft.Office.Interop.Excel.dll 与我们的组件在同一个文件夹中。)

这可能是因为在这台机器的 GAC 中注册了另一个版本的 Interop.Excel 程序集吗?还有其他可能需要调查的领域吗?

注意:用户有 Windows XP 和 Excel 2003。(与他以前工作的机器相同的配置文件。)

提前感谢您的帮助。

【问题讨论】:

    标签: c# .net excel com rtd


    【解决方案1】:

    接口 IID '{A43788C1-D91B-11D3-8F39-00C04F3651B8}

    这就是 IRTDUpdateEvent 接口。它确实在 HKCU\Interfaces 中有一个声明标准编组器的条目。这需要一个类型库,LIBID 是 {00020813-0000-0000-C000-000000000046}。

    错误消息告诉您的是,该计算机上的注册表缺少注册表项 HKCR\TypeLib\{00020813-0000-0000-C000-000000000046} 或其子项之一。这可能是因为它安装了旧版本的 Office,但这很明显。只是简单的注册表损坏是此类事故的主要原因。最好把机器扔掉,让它停止浪费每个人的时间。如果由于某种原因不切实际,请重新安装 Office。尝试修复注册表项应该是您最后的选择,这种损坏很少孤立。

    【讨论】:

    • 谢谢,汉斯。我喜欢这样的评论:“最好把机器扔掉,让它停止浪费每个人的时间。”我希望它在哪里那么容易。这些是外部客户(不是内部用户)......但我认为这可能是我传递的信息(用更多的政治术语)。
    • 嗨汉斯 - 阅读您的帖子后,我检查了用户的机器,实际上,他确实有 IRTDUpdateEvent 的注册表项以及 HKCR\TypeLib\{00020813-0000-0000-C000-000000000046 } 在注册表中也是如此。 IRTDUpdateEvent\TypeLib\Version 值为 1.5,当我检查 HCKR\...\{0002...\1.5 时,它似乎是按顺序排列的 - 具有 InteropAssembly 的子键和按顺序排列的 win32。用户正在运行 Excel 2003。我们将让他升级到 2007。也许这是我们在使用 Excel 2007 的机器上开发和编译的问题?
    • IRTDUpdateEvent 仅记录在 Office 2007 中,因此我无法预测您尝试 2003 时会发生什么。2007 的类型库版本是 1.6。您可以在 SysInternals 的 ProcMon 实用程序上浪费更多时间,您会看到它正在搜索类型库。
    • 嗯...我们最初针对 Excel 2003 开发了此应用程序,并且有许多用户使用该版本运行。看来问题是这台机器独有的,或者是我们给他的安装程序版本。您是否知道任何可能解释在针对这些互操作程序集进行编译时要注意的版本问题的参考资料?
    • 用户升级到 Excel 2007 并解决了问题。他以前使用 Excel 2003(在另一台机器上)运行此组件。这样用户的问题就解决了,虽然我还是想解开版本之谜。
    【解决方案2】:

    您实际上可以通过在与 Excel 相同的线程上调用 UpdateNotify 来解决此问题。 见:https://stackoverflow.com/a/27006281/949779

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2011-02-25
      • 2012-03-31
      • 1970-01-01
      相关资源
      最近更新 更多