【问题标题】:Load assembly from same folder with a native DLL使用本机 DLL 从同一文件夹加载程序集
【发布时间】:2011-11-24 11:31:16
【问题描述】:

我有这个(本机)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 调用 API(通过 MM),我就会得到一个 System.IO.FileNotFoundException(未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'M,版本 = 1.0.0.0,文化 =中性,PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。)

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

这可能吗?

【问题讨论】:

  • 一个快速的解决方案可能是修改系统 PATH 变量以包含 COM 服务器的位置及其子组件。
  • 这里没有有吸引力的选择,只有一个,将托管程序集部署到 GAC。首先给它一个强名称。
  • 嗯,当然,部署到 GAC 是可行的,但由于某些特殊要求,我不能这样做。所以看起来我陷入了反思。

标签: .net c++ com interop .net-assembly


【解决方案1】:

请参阅有关 Windows 如何在 msdn (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx) 上定位 DLL 的讨论。加载 COM 服务器时,依赖的 DLL 必须由 windows 定位。确保搜索算法将找到相关的 DLL。

【讨论】:

  • 至少在我的开发者机器上,N、M、MM所在的文件夹添加到PATH环境变量中,还是找不到托管程序集。 (但是,这不适用于客户机器。)
  • 在这种情况下,请忽略我上面的评论。
  • 也许 .net 系统忽略了 PATH 环境变量。请参阅msdn.microsoft.com/en-us/library/windows/desktop/… 的讨论。也许可以告诉 .net 不要忽略 PATH 变量。我没有时间为你找出方法(不幸的是)。
  • 好吧,我可以用反射解决这个问题,我可以从特定路径加载程序集,但是我必须编写很多代码。有了 using 指令,一切就这么简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多