Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
参考COM+;来自具有不同GUID的.Net_.net_Com_Wrapper - Fatal编程技术网

参考COM+;来自具有不同GUID的.Net

参考COM+;来自具有不同GUID的.Net,.net,com,wrapper,.net,Com,Wrapper,我们有一个引用COM+组件(用VB6编写)的项目。这些组件通过“添加引用”添加到我们的.Net解决方案中。 这很有效,甚至智能感知也有效 组件的接口(兼容性)时不时被破坏,我们的.Net代码不再工作。组件添加了特定的GUID,该GUID不再注册 问题是: 是否可以按照我们习惯的方式调用COM+组件(不允许反射),而不必更新.Net解决方案中的引用。例如,根据文件名为COM+组件创建包装器 问候,, 不知道正确的GUID,.NET(以及任何本机程序)将无法实例化COM组件 最好的办法是首先防止组件

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

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

问题是: 是否可以按照我们习惯的方式调用COM+组件(不允许反射),而不必更新.Net解决方案中的引用。例如,根据文件名为COM+组件创建包装器

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


最好的办法是首先防止组件更改guid在组件项目中启用二进制兼容性,并维护接口以保持兼容。一旦中断了接口兼容性,就必须将组件读取到程序中,以便创建新的有效引用。这并不是因为.NET是哑的,这是因为一旦您破坏了接口兼容性,就需要重新编译客户端。

当您添加对COM对象的引用时,Visual Studio会自动为您创建一个“互操作”。这个互操作本质上是一个包装类,负责加载COM对象,并包含用于进行函数调用的p-invoke语句

如果COM对象正在更改-您可以在每次更新COM对象时重新添加引用,也可以自己生成互操作

可以使用tlbimp工具执行此操作:

TlbImp.exe "MyCOMClass.dll" /out:Interop.MyCOMClass.dll
现在,如果您只需添加对Interop.MyCOMClass.dll的引用而不是COM对象,那么如果COM项目发生更改,您只需使用上面的语句重新生成Interop,并将其与COM对象的新版本一起分发即可。

这是解决方案:

  • 复制并粘贴已编译的VB6 DLL
  • 将示例的扩展名更改为DllName.cmp
  • 设置DLL和.cmp文件之间的二进制兼容性
  • VB6 DLL GUID在您再次编译时不会更改;)


    Project>Properties>Compile

    当你说接口坏了,你的意思是它们变了吗?是的,接口坏了,但不是我需要的类。通常我们在编译VB6组件时使用二进制兼容性。这就是问题所在,我不想重新生成COM互操作。我将选择这一点作为答案,现在我将通过在.Net和目标组件之间挤出一个额外的组件来解决我的问题。这样,引用始终保持不变,我不必重新生成COM互操作。