使用不同的GUID从.Net引用COM +

时间:2010-07-21 11:41:49

标签: .net com wrapper

我们有一个引用COM +组件的项目(用VB6编写)。通过“添加引用”将组件添加到我们的.Net解决方案中。 这很有效,甚至是智能感知。

现在,组件的接口(兼容性)被破坏,我们的.Net代码不再起作用了。该组件添加了特定的GUID,GUID不再注册。

问题: 是否可以像我们习惯的那样调用COM +组件(不允许反射),而无需更新.Net解决方案中的引用。例如,通过基于文件名创建COM +组件的包装器?

此致 微米。

3 个答案:

答案 0 :(得分:3)

不,.NET(以及任何本机程序)在不知道正确的GUID的情况下将无法实例化COM组件。

最好的办法是防止组件首先更改GUID,打开组件项目中的二进制兼容性,并保持接口保持兼容。一旦打破了接口兼容性,就必须将组件读入程序,以便创建新的有效引用。那不是因为.NET愚蠢,那是因为一旦你破坏了接口兼容性,你需要重新编译客户端。

答案 1 :(得分: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对象。

答案 2 :(得分:0)

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

  1. 复制并粘贴已编译的VB6 DLL。
  2. 将扩展名更改为DllName.cmp以获取样本
  3. 设置DLL和.cmp文件之间的二进制兼容性。
  4. 再次编译时,VB6 DLL GUID不会改变;)

    项目>属性>编译