C# COM-Interop dll for C++ COM dll 在 2 个解决方案之间不起作用

Posted

技术标签:

【中文标题】C# COM-Interop dll for C++ COM dll 在 2 个解决方案之间不起作用【英文标题】:C# COM-Interop dll for C++ COM dll doesn't work between 2 solutions 【发布时间】: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 帖子,你不需要另一个。 【参考方案1】:

找到的程序集的清单定义与程序集引用不匹配。

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

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

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

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

【讨论】:

以上是关于C# COM-Interop dll for C++ COM dll 在 2 个解决方案之间不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从 C++ .DLL 加载值始终返回 true

C#和C C++调用dll变量转换问题,双指针?

将 char * 参数传递给 C# 函数

C#:使用 char** 参数调用 C++ DLL

如何从本机 C(++) DLL 调用 .NET (C#) 代码?

2015.5.9 C#编写DLL及C#调用C#DLL