避免DLL版本问题

时间:2015-11-03 12:26:12

标签: c++ windows dll

我在C ++中有多个可执行程序,它们使用了许多用C ++编写的库(我有所有这些库的源代码)。

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

EXE ----- DLL
 |         |
 DLL1      DLL2

如果DLL1和DLL2 相同的库且DLL2是DLL1的更新版本,我将无法链接和编译内容。

我该如何解决这个问题?有时候,由于向后兼容性问题,我无法转储DLL1并保持最新状态。

1 个答案:

答案 0 :(得分:2)

微软解决了Windows XP的这个问题,但几乎隐瞒了如何从" native"开发者。

有点令人生畏的MSDN页面Building C/C++ Isolated Applications and Side-by-side Assemblies是对此的跳跃点。

基本上你要做的是:

  1. 将Dll1和Dll2转换为程序集。程序集是一个dll文件+拥有它的清单。称他们为dll1.manifest和dll2.manifest(也许)。

  2. 向EXE和DLL添加manifestdependency *指令,按名称列出上述每个程序集。

  3. 创建子文件夹" dll1"和" dll2"对于每个组件并在其中存储名称为dll的dll。

  4. 注意:" dll"和" exe"不要,他们自己需要成为集会,虽然文件可能推断/鼓励。

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

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

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