【问题标题】:How to resolve .NET dependency of COM component?如何解决 COM 组件的 .NET 依赖关系?
【发布时间】:2026-02-04 20:25:01
【问题描述】:

这是我当前的部署方案:

  • 客户端应用程序部署在文件夹 A 中
  • COM DLL、C++/CLI 包装 DLL 和 .NET 程序集部署在文件夹 B 中
  • DLL/程序集一起形成一个 SDK,客户端应用程序是第三方消费者

它应该是这样工作的:

  • 客户端应用程序启动并创建 COM 对象
  • 客户端应用程序调用 COM 对象中的函数
  • COM 对象将调用转发到 C++/CLI 包装 DLL
  • C++/CLI 包装函数将调用转发到 .NET 程序集

问题:C++/CLI 包装器找不到 .NET 程序集,应用程序崩溃。

目前我能想到的解决方案:

  • 为 .NET 程序集起一个强名称并将其部署到 GAC 而不是文件夹 B
  • 为客户端应用程序提供一个 .config 文件并告诉它在文件夹 B 中查找程序集
  • 将某种自定义“解析程序”添加到动态加载 .NET 程序集的 C++/CLI 包装器(类似于this SO answer

由于种种原因,这些解决方案似乎都不是特别有吸引力。你知道如何解决这个问题的任何其他机制吗?理想的解决方案是在 SDK 端使用某种配置,但据我所知,不可能为程序集提供 .config 文件,不是吗?

由于我不是特别精通 .NET,因此我还要感谢 cmets 的“解析程序例程”解决方案。这是人们经常做的事情,还是出于某种原因应该避免的异国情调?

【问题讨论】:

  • 为什么 C++/CLI 包装器找不到 .NET 程序集?什么错误?
  • @SimonMourier 错误是FileNotFoundException。发生这种情况是因为 .NET 仅在文件夹 A(应用程序的 .exe 文件所在的位置)和 GAC 中查找程序集。
  • 在 C++/CLI 包装器中,您可以挂钩 AssemblyResolve 事件:msdn.microsoft.com/en-us/library/…,并在运行时请求时指向 .NET 程序集。
  • @SimonMourier 是的,这就是我提到的“解析程序例程”解决方案的全部内容。我从我引用的 SO 答案中借用了这个 - 也许是不幸的 - 术语。

标签: .net com c++-cli dependency-management assembly-resolution


【解决方案1】:

在我看来,您所说的“解析程序”是最好的解决方案。由于您的程序集已加载到默认上下文中,因此搜索路径包含客户端应用程序的当前文件夹,而不是程序集的文件夹。 Rearing this article,这是使用 AppDomain.AssemblyResolve 事件的典型案例。 我想您可以将您的程序集加载到自定义上下文中,但这对我来说听起来有点太多(只是我的两分钱)

希望对你有帮助

【讨论】:

    最近更新 更多