【发布时间】:2014-09-19 09:42:09
【问题描述】:
最近我们发现我们的 Wix 脚本中有一个重复的组件 GUID。通用 GUID 用于 2 个名称不同但位于同一目录中的文件。我在网上做了一些搜索发现,这可能会导致以后出现问题,但找不到任何令人满意的相同问题的解决方案。
是否有解决此问题的安全方法?谢谢。
【问题讨论】:
标签: wix installation windows-installer wix3.7
最近我们发现我们的 Wix 脚本中有一个重复的组件 GUID。通用 GUID 用于 2 个名称不同但位于同一目录中的文件。我在网上做了一些搜索发现,这可能会导致以后出现问题,但找不到任何令人满意的相同问题的解决方案。
是否有解决此问题的安全方法?谢谢。
【问题讨论】:
标签: wix installation windows-installer wix3.7
您能否重命名文件并为它们提供一个新的 guid?这是最安全的方法——它解耦了所有引用计数问题。通过重命名文件,您可以为每个文件创建一个新的绝对路径(路径 + 文件名),并且 Windows Installer 本质上是通过分配单个 guid 来引用绝对路径。
对该概念的一些进一步解释。 推荐阅读,我觉得会更清楚:Change my component GUID in wix?
注意:如果您使用大量 delay load 编写 c/c++,请小心重命名您的 dll 文件。
【讨论】:
我会将其添加为另一个答案,因为它实际上是一种“解决”问题的不同方法。
您可以通过为文件分配 两个新的 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 包含文件共享它们。
【讨论】: