繁体   English   中英

使用相同 DLL 的多个版本

[英]Using multiple versions of same DLL

我遇到了这样一种情况,即应用程序具有一个或多个 dll 的多个(不兼容)版本。

app.exe
a.dll                // v3.0
...
plugins/foo/foo.dll
plugins/foo/a.dll    // v4.0
plugins/foo/...

在此示例中, app.exe依赖于a.dll v3.0,而foo.dll依赖于a.dll v4.0。 由于LoadLibrary的搜索顺序,我的exe旁边的a.dll v3.0首先加载,然后由于它已经在memory中,所以跳过了后面的v4.0。

假设我不能:

  • 重命名依赖a.dll (在这种情况下为 a.dll)
  • 修改app.exefoo.dll以将它们升级/降级为通用a.dll版本

有没有办法加载同名 dll 的多个版本来解决这个问题? 我看到了有关 AppDomain 的答案,但这是针对托管 C# 应用程序的,我的用例是本机 C++ dll。

您正在寻找的是一个Activation Context

Activation contexts are data structures in memory containing information that the system can use to redirect an application to load a particular DLL version , COM object instance, or custom window version. 激活上下文的一部分可能包含 DLL 加载程序使用的 DLL 重定向信息; 另一部分可能包含 COM 服务器信息。 激活上下文函数使用、创建、激活和停用激活上下文。 激活函数可以将应用程序的绑定重定向到指定特定 DLL 版本、window 类、COM 服务器、类型库和接口的版本命名对象。 有关激活上下文函数和结构的更多信息,请参阅激活上下文参考

app.exe可以在加载a.dll v3.0 时使用一个激活上下文,并在加载foo.dll时使用另一个激活上下文,因此它使用a.dll

Raymond Chen 发表了一篇博客文章,如何指定我的 DLL 应该从 DLL 所在的同一目录中解析 DLL 依赖项? ,其中涵盖了与您的情况非常相似的场景:

客户有一个加载两个 DLL 的程序,我们称它们为A.DLLB.DLL 这两个 DLL 都使用名为 C.DLL 的通用帮助程序C.DLL 问题是这两个 DLL 想要使用不同的不兼容版本C.DLL The two DLLs A.DLL and B.DLL reside in separate folders, and each folder has a corresponding copy of C.DLL .

除了他的解决方案使用基于清单的方法来使系统隐式处理B.DLL的激活上下文。 如果您可以修改foo.dll以包含清单,则可以在您的情况下采用类似的方法。 否则,您必须让app.exe在加载foo.dll之前手动创建一个新的激活上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM