1

我们在各种机器上构建了一个已使用多年的 .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。(与他以前工作的机器相同的配置文件。)

提前感谢您的帮助。

4

2 回答 2

4

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

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

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

于 2012-04-17T23:29:27.073 回答
1

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

于 2014-11-18T23:42:45.530 回答