.net 使用本机DLL从同一文件夹加载程序集

.net 使用本机DLL从同一文件夹加载程序集,.net,c++,com,interop,.net-assembly,.net,C++,Com,Interop,.net Assembly,我有一个(本机)COM服务器,我们称它为N.dll,它从托管程序集中调用一些API,我们称它为M.dll。为了实现这一点,存在一个混合模式DLL来实现两者的互操作;让我们称之为MM.dll。三个DLL(N、M和MM)驻留在同一个DLL中,COM服务器显然是正确注册的 我正在使用带有MM.dll中的using指令的m.dll程序集 #using "M.dll" using namespace M; 然后实例化并使用M中可用的类型 现在,这个COM服务器可以由驻留在系统中任何位置的任何应用程序实例

我有一个(本机)COM服务器,我们称它为N.dll,它从托管程序集中调用一些API,我们称它为M.dll。为了实现这一点,存在一个混合模式DLL来实现两者的互操作;让我们称之为MM.dll。三个DLL(N、M和MM)驻留在同一个DLL中,COM服务器显然是正确注册的

我正在使用带有MM.dll中的using指令的m.dll程序集

#using "M.dll"
using namespace M;
然后实例化并使用M中可用的类型

现在,这个COM服务器可以由驻留在系统中任何位置的任何应用程序实例化。很明显,这很有效。但只要N需要从M(通过MM)调用API,我就会得到一个
System.IO.FileNotFoundException
(未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'M,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null'或其依赖项之一。系统找不到指定的文件。)

如果我将M.dll程序集复制到可执行文件所在的同一文件夹中,则一切正常。但是,这不是一个解决方案,因为可能有很多应用程序使用COM服务器,我无法将M.dll部署到所有这些地方。出于同样的原因,我也不能为这个过程使用配置文件。我需要一种方法来告诉混合模式MM.dll模块从托管程序集所在的同一文件夹加载托管程序集


这可能吗?

请参阅有关Windows如何在msdn()上查找DLL的讨论。加载COM服务器时,依赖DLL必须由windows定位。确保搜索算法将找到依赖DLL

至少在我的开发人员计算机上,N、M和MM所在的文件夹被添加到PATH环境变量中,但仍然找不到托管程序集。(但是,对于客户机器来说,情况并非如此。)在这种情况下,请忽略我上面的评论。可能.net系统会忽略PATH环境变量。参见对的讨论。也许可以告诉.net不要忽略PATH变量。很遗憾,我没有时间为您找出解决方法。我可以通过反射来解决这个问题,我可以从特定路径加载程序集,但是我必须编写大量代码。使用using指令非常简单。一个快速的解决方案可能是修改systems PATH变量,以包括COM服务器及其子组件的位置。这里没有吸引人的选项,只有一个,将托管程序集部署到GAC。首先给它一个强名称。当然,部署到GAC是可行的,但由于一些特殊要求,我不能这样做。看来我一直在思考。