1

我有一个关于从本机 C++ 应用程序创建的 COM C# 组件的问题。

C# 组件引用了一个包含 COM 接口的程序集。所以项目 A(.dll) 包含 COM 接口,项目 B(.dll) 包含实现该接口的 COM 类。

然后使用我系统上某个文件夹中的 regasm 注册此 C# COM 组件,例如:C:\TestComponent 其中包含 A.dll 和 B.dll,B 是使用 regasm 注册的组件。

当我安装在另一个路径中的本机 C++ 应用程序(COM 服务器)试图从项目 B 创建 C# COM 类的实例时,失败并抱怨找不到 A.dll。

如果我将(仅)A.dll 复制到我的本机 C++ 应用程序的安装目录中,则一切正常。

关于如何告诉我的本机 C++ 应用程序它需要在指定目录或 B.dll 所在目录中找到 A.dll 的任何想法?

亲切的问候,德怀特

4

2 回答 2

2

在 COM 服务器中存在依赖关系总是一个问题,无论它是非托管服务器还是用 C# 编写的服务器。就像 Windows 一样,CLR 只会在几个选定的位置查找 DLL。哪个是 GAC 和 EXE 所在的目录。还可以选择使用 app.exe.config 文件查看 EXE 目录的子目录。

在这里淘汰候选人:你要避免给客户端 EXE 一个 .config 文件,你不能控制它的位置和配置,它是别人的程序。EXE 目录也有同样的问题。

这离开了 GAC。

也是 Regasm.exe 喜欢的位置,只需在将程序集放入 GAC后注册时省略 /codebase 选项即可。这是解决与 COM 密切相关的 DLL Hell 问题的一种非常好的方法,GAC 可以存储您的 DLL 的不同版本。

于 2013-09-10T10:52:56.213 回答
0

据我了解,您只注册了B.dll。这就是原因,COM 系统不知道 A.dll 所在的位置。除了更改工作目录或将 A.dll 的路径添加到系统路径变量或最后但并非最不重要的将 A.dll 复制到 system32 目录之外,我不知道如何告诉应用程序它可以在哪里找到 a (但我讨厌那个)。顺便说一句,拥有一个 DLL 代理,如 A.dll,驻留在与您的应用程序相同的目录中,对我来说似乎完全没问题。

啊还有一件事。你可以,如果你现在的 A.dll 的路径,但不想要上述任何解决方案,你可以看看 Loadlibrary。

于 2013-09-10T09:08:14.747 回答