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

时间:2014-09-19 09:42:09

标签: wix installer windows-installer wix3.7

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

有解决此问题的安全方法吗?感谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

您可以通过为文件分配两个新指南来“解决此问题”,并在的早期使用主要升级删除现有产品 > InstallExecuteSequence 将两个产品版本完全“解耦”。 这种升级形式有效地忽略了Windows Installer的组件规则并安装了升级,就像旧版本从未存在一样。许多公司都在标准化这种类型的升级方案,尽管它既低效又缓慢,因为它消除了组件引用导致的大多数问题。

重要经验法则如果没有正确进行组件引用,则无法使用次要升级或修补程序。我想大多数Wix用户都知道这一点。

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

enter image description here

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

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

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