我们有一个引用COM +组件的项目(用VB6编写)。通过“添加引用”将组件添加到我们的.Net解决方案中。 这很有效,甚至是智能感知。
现在,组件的接口(兼容性)被破坏,我们的.Net代码不再起作用了。该组件添加了特定的GUID,GUID不再注册。
问题: 是否可以像我们习惯的那样调用COM +组件(不允许反射),而无需更新.Net解决方案中的引用。例如,通过基于文件名创建COM +组件的包装器?
此致 微米。
答案 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
再次编译时,VB6 DLL GUID不会改变;)
项目>属性>编译