延迟加载具有相同名称的不同库

Posted

技术标签:

【中文标题】延迟加载具有相同名称的不同库【英文标题】:DelayLoad different libraries with identical names 【发布时间】:2021-06-16 20:55:09 【问题描述】:

我有以下场景:

可执行应用程序可以通过 dll 进行自定义,并且可以并行启动多个自定义项。对于常见任务,这些 dll 可以使用动态链接的开源库,例如 OpenSSL(libssl.liblibcrypto.lib,它们正在检索模块 libssl-1_1-x64。 dlllibcrypto-1_1-x64.dll)。

为了检索所需的库模块,它们与 /delayload 选项链接。但是,如果库具有相同的名称(例如,因为它们是同一库的不同版本),则第一个 LoadLibrary 将为所有库进行绑定。

在更抽象的描述中,以下场景将检索 lib1\lib.dlllib2\lib.dll,但它总是会从 调用功能>lib1\lib.dll,因为这个模块首先被检索到。

程序 - 加载 dll1.dll - 链接 /delayload lib1\lib.lib - 需要 lib1\lib.dll - 加载 dll2.dll - 链接 /delayload lib2\lib.lib - 需要 lib2\lib.dll

有什么方法可以影响 dll2.dll 的绑定,而不是使用GetProcAddress 来获取检索到的 dll?

【问题讨论】:

【参考方案1】:

有什么方法可以影响 dll2.dll 的绑定,而不是使用 GetProcAddress 来获取检索到的 dll?

是的,有。您可以为每个负载使用单独的Activation Context,可以直接通过using the Activation Context API 手动手动,也可以使用清单。

见How can I specify that my DLL should resolve a DLL dependency from the same directory that the DLL is in?:

一个客户的程序加载了两个 DLL,我们称它们为 A.DLLB.DLL这两个 DLL 都使用一个名为 C.DLL 的通用帮助 DLL。问题是这两个 DLL 想要使用C.DLL不同的不兼容版本 两个 DLL A.DLLB.DLL 位于不同的文件夹中,每个文件夹都有对应的C.DLL 的副本。

...

客户希望有办法让A.DLLB.DLL 两个DLL 使用它们各自版本的C.DLL他们怀疑一些带有激活上下文和清单的魔法可能会解决问题,但他们没有专业知识来弄清楚到底是什么。

...

【讨论】:

以上是关于延迟加载具有相同名称的不同库的主要内容,如果未能解决你的问题,请参考以下文章

简单的JavaScript图像延迟加载库Echo.js

存储库模式:如何延迟加载?或者,我应该拆分这个聚合吗?

EF5.X Code First表关联与延迟加载

React 测试库覆盖延迟加载

在 Angular 4 延迟加载中用模块名称替换块名称

图片延迟加载库Layzr