避免DLL版本控制问题 我有C++中的多个可执行程序,它们使用了许多C++语言编写的库(我有它们的全部来源)。

避免DLL版本控制问题 我有C++中的多个可执行程序,它们使用了许多C++语言编写的库(我有它们的全部来源)。,c++,windows,dll,C++,Windows,Dll,我面临的问题是:当可执行EXE包含dll时,它们可能都依赖于其他dll DLL1和DLL2: EXE ----- DLL | | DLL1 DLL2 如果DLL1和DLL2是同一个库,并且DLL2是DLL1的最新版本,那么我将很难链接和编译内容 我怎样才能解决这个问题?有时,由于向后兼容性问题,我不能直接转储DLL1并保持最新版本。Microsoft为Windows XP解决了这个问题,但几乎对“本机”开发人员隐瞒了如何做到这一点的信息 有点吓人的MSDN页面是这

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

EXE ----- DLL
 |         |
 DLL1      DLL2
如果DLL1和DLL2是同一个库,并且DLL2是DLL1的最新版本,那么我将很难链接和编译内容


我怎样才能解决这个问题?有时,由于向后兼容性问题,我不能直接转储DLL1并保持最新版本。

Microsoft为Windows XP解决了这个问题,但几乎对“本机”开发人员隐瞒了如何做到这一点的信息

有点吓人的MSDN页面是这一点的起点

基本上你要做的是:

  • 将Dll1和Dll2转换为程序集。程序集是dll文件+拥有它的清单。称它们为dll1.manifest和dll2.manifest(可能)

  • 将manifestdependency*指令添加到EXE和DLL,它们按名称列出上述每个程序集

  • 为每个程序集创建子文件夹“dll1”和“dll2”,并在其中存储具有相同名称的DLL

  • 注意:“dll”和“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='*'\"")
    

    就个人而言,我的建议是避免整个混乱,只需将程序重新编译成独立的可执行文件。是的,它们会占用更多的磁盘空间,但是这些天,谁在乎呢?考虑到你有所有东西的源代码——而不是下面我复杂的答案——务实的解决方案是重建dll,包括版本号。然后exe将导入并使用“dll.1.0.dll”,dll将导入并使用“dll.2.0.dll”,每个人都可以存在于一个文件夹中。