如何创建清单文件以将我的可执行文件/插件指向我的特定版本的 Qt.dll?

Posted

技术标签:

【中文标题】如何创建清单文件以将我的可执行文件/插件指向我的特定版本的 Qt.dll?【英文标题】:How do I create a manifest file to point my executable/plugin to my specific version of a Qt.dll? 【发布时间】:2011-06-10 17:45:31 【问题描述】:

我无法理解清单的工作方式/它们的用途。

我的情况是这样的:我需要部署自己的实现 Qt 的独立 .exe 以及实现 Qt 的插件(.8bf、photoshop 插件、.dll)。

我有自己的 Qt DLL,我用自定义命名空间和中缀名编译了它,我想安装到 C:\Program Files\MyCompany\Qt 中

我可以使用清单让我的 .exe 和插件都“指向”这些 Qt DLL 吗? exe 和插件都位于 C:\Program Files\MyCompany 的不同子目录中,并且插件的 shell 链接安装在 photoshop\plug-ins 目录中。

是我正在寻找的清单吗?如果是,需要哪些步骤来完成此任务?似乎 Qt DLL 需要一些清单来识别/注册自己,但是在对 msdn 链接进行循环追逐之后,我决定在这里提问(在搜索之后,当然只找到了部分相关的问题)。

【问题讨论】:

【参考方案1】:

听起来让您的程序集可用于程序集缓存会解决您的问题 - 这是 GAC 旨在解决的问题 - 但它有点矫枉过正。

只需在两个目录中提供相同版本的这些 DLL。


清单用于确保您的程序使用特定版本的 DLL(或一组 DLL)。

最著名的例子是当您的应用程序尝试加载comctl32.dll

此 dll 通常在您的 system32 中找到:

 Directory of C:\Windows\System32

11/20/2010  09:25 ᴀᴍ           633,856 comctl32.dll
               1 File(s)        633,856 bytes

除非你做了什么特别的事情,否则你会得到这个版本的 dll(5.82 版)。但是程序想要这个版本的comctl32 是很常见的。大多数为 Windows XP 或更高版本编写的程序都希望确保它们加载comctl32版本 6。他们通过在可执行文件的程序集清单中指定一个条目来表示他们想要公共控件库的特定版本:

<dependency>
   <dependentAssembly>
      <assemblyIdentity 
               type="win32" 
               name="Microsoft.Windows.Common-Controls" 
               version="6.0.0.0" 
               processorArchitecture="X86" 
               publicKeyToken="6595b64144ccf1df" 
               language="*">
      </assemblyIdentity>
   </dependentAssembly>
</dependency>

现在,如果应用程序尝试加载 comctl32.dll,即使在其搜索路径中(甚至在同一文件夹中)已经有一个版本,Windows 也会改为给它版本comctl32.dll 中的 6 个。此 dll 隐藏在特殊位置,人们不应该触摸:

 Directory of C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc

07/13/2009  09:03 ᴩᴍ         1,680,896 comctl32.dll
               1 File(s)      1,680,896 bytes

Bonus chatterWinSxS 如此庞大的原因是它包含了人们可能想要的每个 dll 的每个版本。我统计了那里的 3,619 个组件。您不想删除 WinSxS 的原因是某个程序需要其中一个 dll。

听起来您想要的解决方案是为 Qt 创建一个程序集清单(它定义了一系列相关的 dll),然后将 那个 程序集与 Windows 并排注册端系统。

不幸的是,为了放置在 WinSxS 中,汇编文件似乎必须经过数字签名。 似乎只有通过 Windows Installer 才能将程序集安装在 Side-by-Side 缓存中:

您应该将共享的并行程序集安装为 Windows Installer 程序包的组件。这可以是用于安装或更新您的应用程序的相同安装包。如果共享程序集作为多个应用程序的一部分提供,您应该提供一个合并模块,该模块可以合并到这些应用程序的安装包中,并为程序集中的文件创建目录。

安装程序集需要 Windows Installer 2.0 或更高版本。有关详细信息,请参阅Windows Installer SDK 和Installation of Win32 Assemblies 下的部分。

另见

Installing Side-by-side Assemblies as Shared Assemblies Private Assemblies

【讨论】:

我现在坚信“只运送该死的 dll”范式。谢谢! @Tom:如果 Qt 自己创建/签名/作为合并模块来创建人们可能依赖的各种版本,那就太好了。

以上是关于如何创建清单文件以将我的可执行文件/插件指向我的特定版本的 Qt.dll?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Maven 创建具有依赖关系的可执行 JAR?

我的可执行 JavaFX 文件如何连接到 MySQL 数据库?

在带有符号链接的可执行文件中使用相对路径

Kotlin(Maven) - 没有源文件的可执行JAR

在 Atlassian Bamboo 中,我如何将我的脚本指向 Stash Repo 中的文件?

我的可执行文件中的防病毒误报