避免DLL版本控制问题

Avoiding DLL versioning problems

本文关键字:问题 版本控制 DLL 避免      更新时间:2023-10-16

我在C++中有多个可执行程序,这些程序使用许多也是用C++编写的库(我有所有这些库的来源)。

我面临的问题是:当一个可执行EXE包含一个dll dll时,它们可能都依赖于额外的dll DLL1和DLL2:

EXE ----- DLL
 |         |
 DLL1      DLL2

如果DLL1和DLL2是同一个库,并且DLL2是DLL1的最新版本,则链接和编译内容时会遇到问题。

我该如何解决这个问题?有时,由于向后兼容性问题,我不能只转储DLL1并保持最新。

Microsoft为Windows XP解决了这个问题,但几乎向"本地"开发人员隐瞒了如何做到这一点的信息。

构建C/C++独立应用程序和并行程序集的MSDN页面有点吓人,这就是它的起点。

基本上你要做的是:

  1. 将Dll1和Dll2转换为程序集。程序集是一个dll文件+拥有它的清单。可以称它们为dll.manifest和dll2.manifest。

  2. 将manifestdependency*指令添加到EXE和DLL中,它们按名称列出上面的每个程序集。

  3. 为每个程序集创建子文件夹"dll1"answers"dll2",并将以相同名称命名的dll存储在其中。

注意:"dll"answers"exe"本身不需要是程序集,尽管文档可能会推断/鼓励这样做。


关于步骤2-没有必要手动添加或合并exe或dll的清单文件,因为现代版本的Visual Studio会自动将生成的清单包含在应用程序中。有一个完整的项目设置选项卡专门用于此。

为了钩住这一点,DevStudio#pragma用于注册要包含在生成的清单中的程序集。这是一个应用程序(或dll)如何声明其有兴趣使用comctl32.dll版本的示例-出于您的目的,您可以更改名称以反映您的"dll"程序集名称,并且您的应用程序附带的程序集不需要版本或publicKeyToken参数。

#pragma comment(linker,""/manifestdependency:type='win32' 
  name='Microsoft.Windows.Common-Controls' version='6.0.0.0' 
  processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")