【发布时间】: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