gpt4 book ai didi

c++ - 使用同一个 DLL 的多个版本

转载 作者:行者123 更新时间:2023-12-03 11:05:54 24 4
gpt4 key购买 nike

我遇到过这样一种情况:应用程序具有一个或多个 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。由于 search order of LoadLibrary a.dll我的 exe 旁边的 v3.0 首先加载,然后因为它已经在内存中,所以跳过后面的 v4.0。
假设我不能:
  • 重命名依赖的 dll(在本例中为 a.dll)
  • 修改 app.exe也不是 foo.dll将它们升级/降级为通用 a.dll版本

  • 有没有办法加载同名 dll 的多个版本来解决这个问题?我看到了 this answer关于 AppDomain 但那是针对托管 C# 应用程序的,我的用例是 native 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. One section of the activation context may contain DLL redirection information which is used by the DLL loader; another section may contain COM server information. The activation context functions use, create, activate, and deactivate activation contexts. The activation functions can redirect the binding of an application to version-named objects that specify particular DLL versions, window classes, COM servers, type libraries, and interfaces. For more information about the activation context functions and structures, see the Activation Context Reference.

    app.exe加载时可以使用一个激活上下文 a.dll v3.0,并在加载时使用另一个激活上下文 foo.dll所以它使用 a.dll v4.0 代替。
    Raymond Chen 发表了一篇博客文章, How can I specify that my DLL should resolve a DLL dependency from the same directory that the DLL is in? ,其中涵盖了与您非常相似的场景:

    A customer had a program that loaded two DLLs, let’s call them A.DLL and B.DLL. Both of those DLLs use a common helper DLL called C.DLL. The catch is that the two DLLs want to use different incompatible versions of C.DLL. The two DLLs A.DLL and B.DLL reside in separate folders, and each folder has a corresponding copy of C.DLL.


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

    关于c++ - 使用同一个 DLL 的多个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65359706/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com