C ++调用托管COM对象无法找到依赖程序集

时间:2010-02-02 21:57:46

标签: c# c++ com

我已经在我的开发机器上用C#创建并注册了一个托管COM库。我已成功注册并使用regasm创建了一个.tlb文件,并成功将tlb导入到用于测试的c ++控制台应用程序中。

我的COM程序集名为“efcAPI.dll”,它引用了另一个尚未为COM设置或无论如何都注册为“efcServerDiscovery.dll”的程序集。第二个dll包含我的COM dll使用的一些代码,并且与efcAPI.dll位于同一文件夹中。

有关加载COM组件的一切工作正常。我可以创建在COM中定义的类的实例,并从中调用方法。但是当我调用某些使用efcServerDiscovery.dll中定义的代码的方法时,我得到一个_com_error,它报告它无法加载文件或程序集'efcServerDiscovery'。

我已经验证了在我的硬盘驱动器上存在efcAPI.dll的地方,有一份efcServerDiscovery.dll(这只是我构建的位置并注册了efcAPI.dll)。我还尝试将efcAPI.dll和efcServerDiscovery.dll放在与c ++应用程序相同的目录中,但没有成功。

关于c ++应用程序在哪里寻找程序集或如何发现它的外观的任何建议都会很棒!

4 个答案:

答案 0 :(得分:2)

是的,这是COM组件具有非COM依赖性的问题。 Windows在搜索依赖DLL时不考虑COM DLL的位置。正常的搜索规则有效,包含EXE的文件夹,Windows目录,当前工作目录,PATH环境。 COM服务器的位置不起作用。

假设您不想部署到EXE文件夹,这些都不是存储您的DLL的好地方,尽管许多安装程序已经绝望地将其存储在c:\ windows \ system32或修改系统PATH环境变量。

在运行DLL中的任何代码之前,您可以在C#代码中执行P / Invoke SetDllDirectory()。使用Assembly.GetExecutingAssembly()。位置将执行此操作。但是,这不是一件安全的事情,它可能会改变使用您组件的应用程序的搜索规则。

唯一真正的解决方法是在Windows并排缓存(WinSxS)中安装DLL,并在C#可执行文件中包含清单。鉴于the documentation的状态,我只能祝你好运。

答案 1 :(得分:1)

在这些情况下,我总是从Dependency Walker开始验证是什么&它试图加载的地方就是我认为的。

答案 2 :(得分:0)

fuslogvw将告诉您CLR在哪里寻找程序集

答案 3 :(得分:0)

或使用GAC。

(这是你的角色,stackoverflow)