代码之家  ›  专栏  ›  技术社区  ›  Mel Green

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

  •  1
  • Mel Green  · 技术社区  · 15 年前

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

    我的COM程序集称为“efcapi.dll”,它引用了另一个尚未为COM设置或注册在“efcserverdiscovery.dll”中的程序集。第二个dll包含一些由我的COM dll使用的代码,与efcapi.dll位于同一文件夹中。

    所有有关加载COM程序集的操作都正常。我可以创建在com中定义的类的实例并从中调用方法。但是,当我调用某些使用efcserverdiscovery.dll中定义的代码的方法时,会收到一个“com”错误,该错误报告它无法加载文件或程序集“efcserverdiscovery”。

    我已经验证了在我的硬盘驱动器上存在efcapi.dll的每个地方都有一个efcserverdiscovery.dll的副本(这正是我从中生成和注册efcapi.dll的位置)。我还试图将efcapi.dll和efcserverdiscovery.dll放在与C++应用程序相同的目录中,但没有成功。

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

    4 回复  |  直到 15 年前
        1
  •  2
  •   Hans Passant    15 年前

    是的,这是COM组件具有非COM依赖项的问题。windows在搜索依赖dll时不考虑com dll的位置。正常的搜索规则是有效的,先包含exe的文件夹,windows目录,当前工作目录,路径环境。COM服务器的位置不起作用。

    假设您不想部署到EXE文件夹,这些都不是存储DLL的好地方,尽管许多安装程序不顾一切地将其存储在C:\ Windows\System32中或修改系统路径环境变量。

    在运行dll中的任何代码之前,可以在c代码中执行p/invoke setdlldirectory()。使用assembly.getExecutingAssembly()。location将执行此操作。不过,这并不是一件安全的事情,它可能会改变使用组件的应用程序的搜索规则。

    唯一真正的解决方法是在windows并行缓存(winsxs)中安装dll,并在c可执行文件中包含清单。鉴于 the documentation ,我只能祝你好运。

        2
  •  1
  •   Ruddy    15 年前

    在这种情况下,我总是从 Dependency Walker 验证它试图加载的内容是我认为的内容。

        3
  •  0
  •   pm100    15 年前

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

        4
  •  0
  •   ima    15 年前

    或者使用GAC。

    (这是你的角色,stackoverflow)