使用不同GUID从.Net引用COM+参考

3
我们有一个涉及COM+组件(用VB6编写)的项目。这些组件通过“添加引用”添加到我们的.Net解决方案中。 这种方式可以很好地工作,甚至智能感知也可以正常使用。
但是偶尔会出现组件接口(兼容性)被破坏的情况,导致我们的.Net代码无法运行。该组件是使用特定GUID添加的,但该GUID已不再注册。
问题: 是否有可能以与之前同样的方式调用COM+组件(不允许使用反射),而无需更新我们的.Net解决方案中的引用。例如,通过基于文件名为COM+组件创建包装器?
问候, M.

当你说接口已经损坏时,你是指它们已经改变了吗? - John Sibly
是的,界面已经被破坏了,但并不影响我需要的那些类。通常在编译VB6组件时我们使用二进制兼容性。 - Michel van Engelen
3个回答

3
不,.NET(以及任何本地程序)都无法在不知道正确GUID的情况下实例化COM组件。
你最好的选择是在组件项目中打开二进制兼容性并保持接口兼容性,以防止该组件首先更改GUID。一旦您打破接口兼容性,您将不得不重新添加组件到程序中,以创建一个新的有效引用。这不是因为.NET很蠢,而是因为一旦您打破了接口兼容性,您需要重新编译客户端。

我将选择这个作为答案,并通过在 .Net 和目标组件之间添加一个额外的组件来解决我的问题。这样,引用始终保持不变,我就不必重新生成 COM 互操作。 - Michel van Engelen

2
当您添加对COM对象的引用时,Visual Studio会自动为您创建一个“Interop”。这个Interop实质上是一个包装类,负责加载COM对象,并包含p-invoke语句以进行函数调用。
如果您的COM对象正在更改-您可以每次更新COM对象时重新添加引用,或者您可以自己生成Interop。
您可以使用tlbimp工具来完成此操作:
TlbImp.exe "MyCOMClass.dll" /out:Interop.MyCOMClass.dll

如果您只是添加对 Interop.MyCOMClass.dll 的引用而不是 COM 对象,则如果 COM 对象发生更改,您可以使用上述语句重新生成 Interop 并将其与新版本的 COM 对象一起分发。

这就是问题所在,我不想重新生成COM互操作。 - Michel van Engelen

0

这是解决方案:http://support.microsoft.com/kb/161137

  1. 复制并粘贴您编译的VB6 DLL。
  2. 将扩展名更改为DllName.cmp,以供示例使用
  3. 在您的DLL和.cmp文件之间设置二进制兼容性。

当您再次编译它时,VB6 DLL GUID不会改变 ;)

项目 > 属性 > 编译


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