在Wix中安全地解析重复的组件guid

在Wix中安全地解析重复的组件guid,wix,installation,windows-installer,wix3.7,Wix,Installation,Windows Installer,Wix3.7,最近,我们发现Wix脚本中有一个重复的组件GUID。公共GUID用于两个名称不同但位于同一目录中的文件。我在网上做了一些搜索发现,这可能会导致以后的问题,但找不到任何令人满意的解决相同问题的方法 有没有安全的方法来解决这个问题?谢谢。你能给这些文件重新命名,并给它们各自提供一个新的guid吗?这是最安全的方法-它将所有引用计数问题解耦。通过重命名文件,可以为每个文件创建一个新的绝对路径(路径+文件名),Windows Installer通过指定一个guid来计算绝对路径 对这一概念的进一步解释推

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


有没有安全的方法来解决这个问题?谢谢。

你能给这些文件重新命名,并给它们各自提供一个新的guid吗?这是最安全的方法-它将所有引用计数问题解耦。通过重命名文件,可以为每个文件创建一个新的绝对路径(路径+文件名),Windows Installer通过指定一个guid来计算绝对路径

对这一概念的进一步解释推荐阅读,我想它会更清晰:


注意:如果您正在使用大量代码编写c/c++时,请小心重命名dll文件。

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

您可以通过为文件分配两个新的guid来“解决此问题”,并在InstallExecuteSequence的早期使用主要升级删除现有产品,以完全“解耦”两个产品版本。这种形式的升级实际上忽略了Windows Installer的组件规则,并安装升级,就好像旧版本不存在一样。许多公司对这种类型的升级场景进行标准化,尽管它既低效又缓慢,因为它消除了由组件引用引起的大多数问题

重要经验法则:如果组件引用不正确,则不能使用小升级或修补程序。我想大多数Wix用户都知道这一点

(当两个文件共享一个guid时,从技术上讲,只给其中一个文件一个新的guid是可能的,但我从不这样做以避免遗留问题重新出现。尤其是老式的遗留sharedll引用计数可能会出现错误:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\sharedll
。如果他
msidbComponentAttributesSharedDllRefCount
位集):

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

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


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

@Glytzkof感谢您的快速响应,我们将尝试此方法!还要注意,并依赖Wix默认值而不是硬编码值。仅此而已ty,如果它是一个无法重命名的.net文件,我们会怎么做?最后一点意见:某些.net程序集根据定义是多文件的。在这种情况下,组成程序集的所有文件都应使用相同的Wix组件安装。这是为了使这些文件成为一个“原子单元”作为一个集合,而不是单个文件。这是一个附带的一般建议,在Wix中每个组件始终使用单个文件,以避免升级问题。感谢您的回复!