本机应用程序中的CoCreateInstance C#COM组件找不到引用 我有一个问题,关于一个COM C组件是由一个本地C++应用程序创建的。

本机应用程序中的CoCreateInstance C#COM组件找不到引用 我有一个问题,关于一个COM C组件是由一个本地C++应用程序创建的。,c#,c++,.net,com,com+,C#,C++,.net,Com,Com+,C#组件正在引用包含COM接口的程序集。 因此,项目A(.dll)包含COM接口,项目B(.dll)包含实现此接口的COM类 然后使用regasm从我的系统上的某个文件夹注册此C#COM组件,例如: C:\TestComponent,其中包含A.dll和B.dll,B是使用regasm注册的组件 当我在本地安装的C++应用程序(COM Server)安装在另一个路径时,试图从项目B中创建C.Y.COM类的实例时,这就抱怨A.dll无法找到。 < >如果我只复制.dLL到我的本地C++应用程序的安

C#组件正在引用包含COM接口的程序集。 因此,项目A(.dll)包含COM接口,项目B(.dll)包含实现此接口的COM类

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

当我在本地安装的C++应用程序(COM Server)安装在另一个路径时,试图从项目B中创建C.Y.COM类的实例时,这就抱怨A.dll无法找到。 < >如果我只复制.dLL到我的本地C++应用程序的安装目录,一切都很好。

关于如何告诉我的本地C++应用程序,它需要在指定目录或B.dll所在的目录中找到.dLL的任何想法? 亲切问候,,
据我所知,您只注册了B.dll。这就是COM系统不知道.dll驻留在哪里的原因。我不知道如何告诉应用程序它可以在哪里找到a,除了更改workingdirectory或将a.dll的路径添加到系统路径变量中,或者最后但并非最不重要的是将a.dll复制到system32目录中(但我讨厌这样)。 顺便说一句,拥有一个DLL代理,就像.DLL一样,与应用程序驻留在同一个目录中,对我来说似乎完全没问题


啊,还有一件事。如果您现在已找到A.dll的路径,但不需要上述任何解决方案,则可以查看Loadlibrary。

在COM服务器中具有依赖项始终是一个问题,无论是非托管服务器还是用C#编写的服务器。与Windows一样,CLR只会在几个选定的位置查找DLL。它们是GAC和EXE所在的目录。通过使用app.EXE.config文件,还可以选择查看EXE目录的子目录

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

这就剩下了GAC


另外,Regasm.exe更喜欢的位置是,在放置程序集后注册时,只需省略/codebase选项。这是一个很好的解决DLL地狱问题的方法,因为DLL地狱问题与COM密切相关,GAC可以存储不同版本的DLL。

我在这里做一个很大的假设。您是否只是试图让本机应用程序与C#应用程序通信,同时在同一进程中托管两个“虚拟”应用程序?如果是这样的话,那么我真的建议你停止使用COM,简单地使用一种更好的ol'DLL方法。您是否查看了@Robert Giesecke的“非托管导出”模板?看看:您是否使用“regasm.exe/codebase”?如果没有,试试看。