用于 C++ COM dll 的 C# COM-Interop dll 在两种解决方案之间不起作用

C# COM-Interop dll for C++ COM dll doesn't work between 2 solutions

我试图在另一个项目中重用在一个项目中编译的互操作 DLL,但它不起作用。

我会详细说明:

问题是 RemoteComClient.dll 尝试加载 native_com_object.dll 它 必须 使用它自己的 Interop。如果我尝试使用 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)。

The located assembly's manifest definition does not match the assembly reference.

非常常见的异常消息,它在运行时发现的 DLL 与编译程序时使用的参考程序集不同。一个非常基本的 DLL 地狱问题,并非特定于 COM 互操作。

您使用 Fuslogvw.exe 诊断此类故障,它对失败的程序集绑定的跟踪会向您显示它查找的内容和发现的内容。通常不匹配的是版本号,您使用 1.0.0.0 版本的互操作程序集编译程序。该版本是从 COM 服务器的类型库版本号生成的。如果 COM 服务器更改并且您使用其较新的互操作程序集,则您使用的是 1.0 版,kaboom。

而且 PublicKeyToken 很容易不匹配,您希望互操作 DLL 没有。 Kaboom 如果你在运行时加载的那个确实有一个。在 COM 互操作中并不少见,您倾向于将它们存储在 GAC 中,这需要一个强名称。您通常稍后会做的事情,忘记重建应用程序是一个容易犯的错误。

解决方案是使用正确的互操作程序集重建客户端应用程序。