【发布时间】: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