我有一个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。