这个问题与这个问题有点相似,只是有点扭曲: 我可以修改并排汇编搜索顺序吗?
我们有几个不同的软件,用不同的语言制作,它们在运行时会相互通信。为了实现这一点,我们制作了使用免注册 COM 激活加载的 .NET COM 对象。这很好用。我们使用的某些语言无法加载 COM,因此我们制作了一个 C++ Wrapper DLL,它使用 ACTCTX 从其嵌入的清单中激活 COM。也运作良好。
但是现在,我们有一个案例,我们的 C++ Wrapper 是由一个不属于我们的应用程序(我们称之为运行时)运行的代码加载的,该应用程序位于某个地方,而我们的应用程序位于其他地方。我们宁愿将 COM 对象部署在与应用程序部署相同的位置,而不是在运行时应用程序旁边。
这并不重要,因为概念保持不变,但运行器是 FourJ 的 Genero (fgl.exe),调用我们的 C++ 包装器的代码位于 .42m 文件中。运行器 (fgl.exe) 与 Genero 一起安装,默认情况下位于 Program Files\FourJs 中,我们的应用程序位于另一个目录中,名称为我们公司的名称,即:Program Files\MyCompany
这与使用 Java 得到的类似。在一个地方运行时,在其他地方应用程序。
所以在我们的例子中,我们的 .42m 正确加载了 C++ Wrapper,包装器正确激活了 COM(与我们的 .42m 和 wrapper 位于同一目录中)但是一旦我们尝试实例化一个对象,我们就会得到一个“80070002”文件未发现错误。
我已阅读 Assembly Searching Sequence并注意到使用 Process Monitor 描述的行为。
所以会发生什么,因为最终运行的是 fgl.exe,Windows Side-By-Side 加载程序会查看:
- C:\Program Files(x86)\FourJs\fgl\gen2.50\bin\MyCom.dll
- C:\Program Files(x86)\FourJs\fgl\gen2.50\bin\MyCom.dll\MyCom.dll
虽然我的 COM 确实在 C:\Program Files(x86)\MyCompany\MyApplication\MyCom.dll
为了确认行为,我们将 COM 复制到与 fgl.exe 相同的目录中,并且正如预期的那样,它可以工作。
所以我希望能够在我的激活上下文中添加一个搜索目录,以便它在我的部署目录中查找这个 DLL。这可能吗 ?如果我找不到其他解决方案,我们最终会在该目录中部署我们的 COM,但这不正确。
谢谢