我有一个关于从本机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的任何想法?
亲切的问候, 德怀特
答案 0 :(得分:2)
在COM服务器中具有依赖性始终是一个问题,无论是非托管服务器还是用C#编写的服务器。就像Windows一样,CLR只会查看DLL的几个选定位置。哪个是GAC和EXE所在的目录。还可以选择使用app.exe.config文件查看EXE目录的子目录。
在这里淘汰候选人:你要避免给客户端EXE一个.config文件,你不能控制它的位置和配置,这是别人的程序。 EXE目录也存在同样的问题。
离开GAC。
此外,Regasm.exe更喜欢的位置,在您放置程序集in the GAC后注册时,只需省略/ codebase选项。并且是解决与COM密切相关的DLL Hell问题的一种非常好的方法,GAC可以存储不同版本的DLL。
答案 1 :(得分:0)
据我了解,您只注册了B.dll。这就是原因,COM系统不知道A.dll驻留的地方。除了更改工作目录或将A.dll的路径添加到系统路径变量或最后但并非最不重要的是将A.dll复制到system32目录中之外,我不知道如何告诉应用程序它可以找到的位置(但我讨厌那个)。 顺便说一下,像A.dll这样的DLL代理驻留在同一个目录中,因为你的应用程序对我来说似乎完全没问题。
还有一件事。如果您现在是A.dll的路径但不想要上述任何解决方案,您可以查看Loadlibrary。