切换具有不同GUID的互操作程序集

时间:2020-02-03 16:33:34

标签: c# .net com-interop

我有一个C ++ COM组件/ DLL,我想在我的C#应用​​程序中加载它。我使用 tlbImp.exe 创建了一个互操作程序集,并且在过去的几年中一直有效。

我有不同版本的应用程序。根据我的应用程序的不同版本,我为COM组件提供了不同的GUID,以便可以并排安装它们。对于开发环境,我有自己的指导。

编译我的应用程序后,文件打包在一起,并且将相应的互操作程序集放入包中。到目前为止,我使用.Net framework 2.0是因为我有一些无法升级的客户。该客户现在切换到了.Net Framework的较新版本,我可以将应用程序升级到.Net 4.5.2.。

当我的应用程序加载时,它通过对另一个类的方法调用来获取COM组件类的Object。该方法向我传递了一个正确的对象。使用V1 GUID。我尝试将类型Object的对象转换为类型CCHView,这是由 tlbImp.exe 生成的接口。问题在于,所引用的类型CCHView仍然具有开发GUID。

Object interopObject = InteropController.GetCHView(); //this object has GUID V1
if (interopObject != null)
{
             //This Type expects/has the development GUID
   _chView = (CCHView)interopObject; //this crashes in 4.5 but not in 2.0
   CCHViewCommunicator communicator = CCHViewCommunicator.Instance();
   communicator.SetControl(_chView);
   communicator.Run();
   _chViewConnector = new CCHViewConnector(_chView);
}

即使在打包时切换了互操作程序集,开发GUID似乎也已“嵌入”应用程序中。

我试图为.Net 2.0和4.0创建行为相同的互操作程序集,这意味着当在.Net 4.5应用程序中使用时,两者均崩溃。

当我仅将我的applicationXYZ.csproj从.Net 2.0切换到.Net 4.5时,就会发生错误,其他所有内容都保持不变。为什么.Net 4.5的行为方式有所不同,有没有办法解决此问题?

如果有兴趣,请在这里找到GUID。

  • GUID V1:{D39B90BA-5CB8-4C20-8726-3BB7758DB5D1}
  • GUID V2:{30485704-5B4E-4CED-81E9-6A49D7F3247D}
  • 开发GUID:{6875B12E-9DF1-4896-A2D9-02CCFD0A10F0}

0 个答案:

没有答案