【发布时间】:2015-01-29 10:32:46
【问题描述】:
我正在尝试在另一个项目中重用在一个项目中编译的互操作 DLL,但它不起作用。
我会详细说明:
- 我编译了 C++ COM DLL native_com_object.dll
- 在同一个解决方案中,我有一个名为 LocalComClient.dll 的 C# 项目,它生成 Interop.native_com_objectLib.dll 以使用 C++ native_com_object.dll。
- 最后,我有一个另一个解决方案,其中包含一个名为 RemoteComClient.dll 的 C# 项目(正在另一台计算机上编译),它引用了 native_com_object.dll(在该计算机中注册)。这会生成另一个 Interop.native_com_objectLib.dll。
问题是 RemoteComClient.dll 尝试加载 native_com_object.dll 它必须使用它自己的互操作。如果我尝试使用 LocalComClient.dll Interop .Net 无法加载程序集。
编辑:我得到的确切异常消息是:
Could not load file or assembly 'Interop.native_com_objectLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
当然反之亦然(LocalComClient不能使用RemoteComClient的Interop)。
我的第一个问题是 - 为什么?据我了解,它应该生成相同的互操作(显然我错了)。
我的第二个问题是,是否可以为 DLL 的所有 .Net 客户端创建一个互操作?
我会指出我使用的是 VS2013(两台机器),C# 对象是 AnyCPU,C++ 是 x64。
重要编辑:我无法嵌入互操作类型,因为 C# 项目是 .Net 3.5(不是 4)。
【问题讨论】:
-
注册 C++ dll 并添加对 C# 引用的引用后。那么您是否将 Embed Interop Types 属性设置为 False?...
-
@VeeramaniBala - 我使用的是 .net 3.5,我无法将其升级到 4.0
-
这个问题经常使用“不起作用”和“失败”。记录准确出了什么问题,至少是异常消息和堆栈跟踪。
-
@HansPassant - 你完全正确!添加了我得到的异常。
-
只需用谷歌搜索异常消息,“找到的程序集的清单定义与程序集引用不匹配”。六万五千次点击,前两个是 SO 帖子,你不需要另一个。