安全地解决 Wix 中的重复组件 GUID

Posted

技术标签:

【中文标题】安全地解决 Wix 中的重复组件 GUID【英文标题】:Safely resolving duplicate component GUIDs in Wix 【发布时间】:2014-09-19 09:42:09 【问题描述】:

最近我们发现我们的 Wix 脚本中有一个重复的组件 GUID。通用 GUID 用于 2 个名称不同但位于同一目录中的文件。我在网上做了一些搜索发现,这可能会导致以后出现问题,但找不到任何令人满意的相同问题的解决方案。

是否有解决此问题的安全方法?谢谢。

【问题讨论】:

【参考方案1】:

您能否重命名文件并为它们提供一个新的 guid?这是最安全的方法——它解耦了所有引用计数问题。通过重命名文件,您可以为每个文件创建一个新的绝对路径(路径 + 文件名),并且 Windows Installer 本质上是通过分配单个 guid 来引用绝对路径。

对该概念的一些进一步解释。 推荐阅读,我觉得会更清楚:Change my component GUID in wix?

注意:如果您使用大量 delay load 编写 c/c++,请小心重命名您的 dll 文件。

【讨论】:

@Glytzkof 感谢您的快速回复,我们将尝试这种方法! 还要注意 you can leave out a lot of source attributes from your Wix xml file 并依赖 Wix 默认值而不是硬编码值。 只是出于好奇,如果它是一个无法重命名的 .net 文件,我们将如何处理? 最后的评论:一些 .net 程序集根据定义是多文件的。在这些情况下,组成程序集的所有文件都应使用相同的 Wix 组件安装。这是为了使文件成为一个“原子单元”作为一个集合,而不是单个文件。这是一般建议的边缘案例,即始终在 Wix 中为每个组件使用单个文件以避免升级问题。【参考方案2】:

我会将其添加为另一个答案,因为它实际上是一种“解决”问题的不同方法。

您可以通过为文件分配 两个新的 guid 并在 RemoveExistingProducts 早期使用 重大升级 来“解决这个问题” >InstallExecuteSequence 将两个产品版本完全“解耦”。 这种形式的升级有效地忽略了 Windows Installer 的组件规则,并安装升级,就好像旧版本不存在一样。许多公司对这种类型的升级方案进行了标准化,尽管它效率低下而且速度慢,因为它消除了组件引用导致的大部分问题。

重要的经验法则如果您不正确地进行组件引用,则不能使用任何小的升级或补丁。我想大多数 Wix 用户都知道这一点。 p>

(当两个文件共享一个 guid 时,从技术上讲,可以只为其中一个文件提供一个新的 guid,但我从不这样做以避免遗留问题重新出现。特别是旧式遗留 sharedll 引用计数可能最终会干扰: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs。如果Wix component 设置了msidbComponentAttributesSharedDllRefCount 位,则写入此标志):

这是 Windows Installer 之前的引用计数,Windows Installer 也使用它来与传统样式的安装程序“通信”,否则可能只会删除 Windows Installer 引用计数的文件。

我不会为未安装到共享位置的任何文件设置此标志,我相信这是一个好方法。 Installshield 用于为所有组件设置此共享 dll 属性,这会导致在卸载时留下许多奇怪的杂散文件。换句话说:仅当您安装到真正共享的位置时才启用此标志,因为该标志通常是一个问题而不是解决方案。

如果您在自己的应用程序之间共享文件并且不需要第三方应用程序可用的文件,只需将它们安装到 ProgramFiles 并通过 Wix 包含文件共享它们。

【讨论】:

感谢您的回复!

以上是关于安全地解决 Wix 中的重复组件 GUID的主要内容,如果未能解决你的问题,请参考以下文章

从 VS 安装程序转换后的 WiX 组件指南

假设 GUID 始终是唯一的是不是安全?

拆分 WIX 文件

Wix Bootstrapper - 从安全的 http 存储库下载捆绑包

用于包装的 WiX 工具

安全地为查询准备逗号分隔列表[重复]