我有一个关于从 native C++ 应用程序创建 COM C# 组件的问题。
C# 组件正在引用一个包含 COM 接口(interface)的程序集。 所以项目 A(.dll) 包含 COM 接口(interface),项目 B(.dll) 包含实现此接口(interface)的 COM 类。
然后使用我系统上某个文件夹中的 regasm 注册此 C# COM 组件,例如: C:\TestComponent 包含A.dll & B.dll,B是使用regasm注册的。
当安装在另一个路径中的 native C++ 应用程序(COM 服务器)尝试从项目 B 创建 C# COM 类的实例时,失败并提示找不到 A.dll。
如果我(仅)将 A.dll 复制到我的 native C++ 应用程序的安装目录,一切都会完美运行。
关于如何告诉我的原生 C++ 应用它需要在指定目录或 B.dll 所在的目录中找到 A.dll 的任何想法?
亲切的问候, 德怀特
最佳答案
无论是非托管服务器还是用 C# 编写的服务器,在 COM 服务器中具有依赖性始终是一个问题。就像 Windows 一样,CLR 只会在几个选定的位置查找 DLL。分别是GAC和EXE所在的目录。还可以选择使用 app.exe.config 文件查看 EXE 目录的子目录。
在这里敲掉候选人:你会想要避免给客户端 EXE 一个 .config 文件,你不控制它的位置或配置,它是别人的程序。 EXE 目录也有同样的问题。
这离开了 GAC。
也是Regasm.exe喜欢的位置,在你放置程序集后注册时省略/codebase选项in the GAC . GAC 可以存储不同版本的 DLL,这是解决与 COM 密切相关的 DLL hell 问题的一种非常好的方法。
关于c# - 来自 native 应用程序的 CoCreateInstance C# COM 组件找不到引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18714519/