C# 一个用户计算机上的.NET RTD/COM Excel互操作错误?
我们构建了一个.NET COM/Excel RTD Server.NET程序集,该程序集已在各种机器上使用多年,即我们知道它可以工作,并且我们的标准安装方法也可以工作。我们有一位用户将此RTD组件安装在另一台机器上,但在使其顺利运行时遇到问题。我认为问题与Interop.Microsoft.Office.Interop.Excel.dll不兼容或注册不正确有关。具体情况如下: 虽然RTD链路在某种程度上正常工作,但我们的应用程序经常会记录此错误:C# 一个用户计算机上的.NET RTD/COM Excel互操作错误?,c#,.net,excel,com,rtd,C#,.net,Excel,Com,Rtd,我们构建了一个.NET COM/Excel RTD Server.NET程序集,该程序集已在各种机器上使用多年,即我们知道它可以工作,并且我们的标准安装方法也可以工作。我们有一位用户将此RTD组件安装在另一台机器上,但在使其顺利运行时遇到问题。我认为问题与Interop.Microsoft.Office.Interop.Excel.dll不兼容或注册不正确有关。具体情况如下: 虽然RTD链路在某种程度上正常工作,但我们的应用程序经常会记录此错误: RTDServer.NotifyExcel():
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。和他以前的机器一样的外形
提前感谢您的帮助
接口
IID'{A43788C1-D91B-11D3-8F39-00C04F3651B8}
这就是IRTDUpdateEvent接口。它在HKCU\Interfaces中确实有一个声明标准封送拆收器的条目。它需要一个类型库,LIBID是{00020813-0000-0000-C000-0000000000 46}
错误消息告诉您的是,该计算机上的注册表缺少注册表项HKCR\TypeLib\{00020813-0000-0000-C000-0000000000 46}或其子项之一。这可能是因为它安装了旧版本的Office,但这是显而易见的。简单的注册表损坏是导致此类事故的主要原因。最好扔掉这台机器,让它停止浪费每个人的时间。如果由于某种原因而不实用,请重新安装Office。试图修复注册表项应该是你的最后选择,这种损害很少是孤立的
接口
IID'{A43788C1-D91B-11D3-8F39-00C04F3651B8}
这就是IRTDUpdateEvent接口。它在HKCU\Interfaces中确实有一个声明标准封送拆收器的条目。它需要一个类型库,LIBID是{00020813-0000-0000-C000-0000000000 46}
错误消息告诉您的是,该计算机上的注册表缺少注册表项HKCR\TypeLib\{00020813-0000-0000-C000-0000000000 46}或其子项之一。这可能是因为它安装了旧版本的Office,但这是显而易见的。简单的注册表损坏是导致此类事故的主要原因。最好扔掉这台机器,让它停止浪费每个人的时间。如果由于某种原因而不实用,请重新安装Office。尝试修复注册表项应该是您的最后一个选择,这种损坏很少是孤立的。您实际上可以通过在与Excel相同的线程上调用UpdateNotify来解决此问题。
请参阅:您可以通过在与Excel相同的线程上调用UpdateNotify来解决此问题。
请参阅:谢谢,汉斯。我喜欢这样的评论:最好扔掉机器,让它停止浪费每个人的时间。我希望这一切都那么容易。这些是外部客户端而不是内部用户。。。但我认为这可能是我用更具政治性的术语传达的信息。嗨,汉斯-在阅读了你的帖子后,我检查了用户的机器,事实上,他确实有IRTDUpdateEvent的注册表项,还有注册表中的HKCR\TypeLib\{00020813-0000-0000-C000-0000000000 46}。IRTDUpdateEvent\TypeLib\Version的值是1.5,当我检查HCKR \\{0002…\1.5,它似乎正常-有具有互操作权限的子键,还有看起来正常的win32。用户正在运行Excel 2003。我们将让他升级到2007。也许这是我们使用Excel 2007在计算机上开发和编译的问题?IRTDUpdateEvent仅为Office 2007记录,因此我无法预测会发生什么当您尝试2003时。2007年的类型库版本为1.6。您可能会浪费更多时间使用SysInternals的ProcMon实用程序,您将看到它搜索类型库。Hmmm…我们最初是针对Excel 2003开发此应用程序的,并且有许多用户使用该版本运行。似乎此问题是此计算机独有的,或者我们提供给他的安装程序的版本。您知道有任何参考资料可以解释针对这些互操作程序集进行编译时需要注意的版本问题吗?该用户升级到Excel 2007并解决了此问题。他以前在另一台计算机上使用Excel 2003运行此组件。因此,用户的问题得到了解决,尽管虽然我仍然想澄清版本之谜。谢谢,汉斯。我喜欢这个评论,最好扔掉m
疼痛,让它停止浪费每个人的时间。我希望这一切都那么容易。这些是外部客户端而不是内部用户。。。但我认为这可能是我用更具政治性的术语传达的信息。嗨,汉斯-在阅读了你的帖子后,我检查了用户的机器,事实上,他确实有IRTDUpdateEvent的注册表项,还有注册表中的HKCR\TypeLib\{00020813-0000-0000-C000-0000000000 46}。IRTDUpdateEvent\TypeLib\Version的值是1.5,当我检查HCKR \\{0002…\1.5,它似乎正常-有具有互操作权限的子键,还有看起来正常的win32。用户正在运行Excel 2003。我们将让他升级到2007。也许这是我们使用Excel 2007在计算机上开发和编译的问题?IRTDUpdateEvent仅为Office 2007记录,因此我无法预测会发生什么当您尝试2003时。2007年的类型库版本为1.6。您可能会浪费更多时间使用SysInternals的ProcMon实用程序,您将看到它搜索类型库。Hmmm…我们最初是针对Excel 2003开发此应用程序的,并且有许多用户使用该版本运行。似乎此问题是此计算机独有的,或者我们提供给他的安装程序的版本。您知道有任何参考资料可以解释针对这些互操作程序集进行编译时需要注意的版本问题吗?该用户升级到Excel 2007并解决了此问题。他以前在另一台计算机上使用Excel 2003运行此组件。因此,用户的问题得到了解决,尽管虽然我仍然想澄清版本的秘密。