【问题标题】:C++ calling managed COM object can't find dependent assembliesC++ 调用托管 COM 对象找不到依赖程序集
【发布时间】:2010-02-02 21:57:45
【问题描述】:

我已经在我的开发机器上用 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++ 应用程序在哪里寻找程序集或如何发现它在哪里寻找的建议都会很棒!

【问题讨论】:

    标签: c# c++ com


    【解决方案1】:

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

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

    您可以做的一件事是在您的 C# 代码中 P/Invoke SetDllDirectory(),然后再运行 DLL 中的任何代码。使用 Assembly.GetExecutingAssembly().Location 即可。然而,这样做并不安全,它可能会改变使用您的组件的应用程序的搜索规则。

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

    【讨论】:

    • 谢谢 nobugz,我试试看。
    • 好吧,将 dll 放在与 c++ 可执行文件相同的目录中将允许它加载它。虽然我以为我之前已经尝试过,但结果我弄错了 Visual Studio 正在运行哪个可执行文件。感谢所有的帮助!我要解决这个问题。
    【解决方案2】:

    在这些情况下,我总是从Dependency Walker 开始验证它尝试加载的内容和位置是我认为的。

    【讨论】:

    • 嘿,红润,我试过这个,但依赖只显示 MSCOREE.DLL 作为 efcAPI.dll 的依赖项。 efcServerDiscovery.dll 找不到了。
    • 这可能是因为程序集被动态加载。你可以试试 ProcessMonitor (technet.microsoft.com/en-us/sysinternals/bb896645.aspx),它可以让你看到一个进程试图做什么——它做了很多,但你可以过滤掉噪音,看看应用程序试图访问文件的方式。跨度>
    • 是的,ProcessMonitor 显示应用程序在他的帖子中提到的 nobugz 位置中寻找 dll。这帮助我找到了它正在查询的应用程序目录。我不小心把它放在了错误的地方。感谢您的提示!
    【解决方案3】:

    fuslogvw 会告诉你 CLR 在哪里寻找程序集

    【讨论】:

      【解决方案4】:

      或者使用 GAC。

      (这是你的角色,stackoverflow)

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 2012-11-25
        • 2012-09-23
        • 1970-01-01
        相关资源
        最近更新 更多