COM应用程序引用dll故障排除

时间:2017-06-28 17:48:25

标签: c# com installation assemblies

我有一个WPF应用程序,我构建为dll COM组件并使用installshieldLE进行安装,但是在运行我的COM客户端时,我遇到了一些依赖dll的问题。

我的WPF dll引用了位于同一VS2012解决方案中的另外两个C#dll(A& B)。

我的WPF dll已经选中了COM interop选项的注册表,并提供了一个用于运行WPF GUI应用程序的COM接口。

我有一个C COM客户端程序,它测试WPF应用程序。我遇到的问题是我需要在客户端程序的文件夹中包含一些dll_A引用的dll(它是第三方图形包),以便应用程序成功运行。我不必在本地客户端目录中包含dll_A或dll_B。

此外,COM服务器dll引用的其他(C)dll包含在安装中,不需要出现在客户端目录中,因此很难理解。

我认为这不是WPF问题,只是关于com服务器安装与其他引用程序集相关的问题。

我在主dll中输出了一些调试消息,确认dll A& B以及主COM dll正在从安装位置运行。但是当本地客户端文件夹中缺少第三方dll时,我得到了更多的例外。

有人可以帮我解决这个问题。我可以从安装位置成功运行客户端程序,因此我确定所有必需的程序集和dll都存在。

感谢。

2 个答案:

答案 0 :(得分:0)

听起来您遇到了与DLL加载路径相关的问题。客户端应用程序可以加载您的COM DLL,但您的COM DLL无法加载自己的依赖项(或依赖项的依赖项等),即使依赖项存在于与COM DLL相同的文件夹中。这是对的吗?

如果是这样,我相信这个问题可以通过调用AddDllDirectory函数来解决 - 只需让你的COM DLL在加载任何依赖项之前调用它,并在完成后调用RemoveDllDirectory。有关详细信息,请参阅LoadLibrary文档的“备注”部分。

答案 1 :(得分:0)

问题是由一个引用的dll使用.Net 4.0编译引起的,而其他dll是使用.Net 4.0客户端编译的。用.Net 4.0 Client重新编译解决了这个问题。

当将应用程序作为已注册的com组件执行时,似乎会发生此问题,而客户端是从其他位置执行的。如果将违规的dll复制到客户端目录,一切运行正常。