WiX在卸载时无法删除注册表键。

9

我创建了一个组件,并使用一个名为DISABLEMSIUPGRADE的条件来安装MSI时设置。然而,MSI在卸载时不会删除该条目。我认为问题是由条件引起的,但我无法解决它。

<Component Id="compMSI" Guid="5f18af6a-b839-4b4d-9d4f-79cf7826f749">
  <Condition>DISABLEMSIUPGRADE</Condition>

  <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(var.PGuid)" Action="createAndRemoveOnUninstall">
    <RegistryValue Name="DisplayName" Type="string" Value="$(var.ProductTitle)" />
    <!-- ... -->
  </RegistryKey>
</Component>

我甚至在其他组件中放置了RemoveRegistryKey元素,以确保键被删除,但这也没有起作用...

我还尝试在键中存储和读取DISABLEMSIUPGRADE属性。

//编辑:我进行了一些实验,并发现CONDITION元素不是原因。看起来如果我安装了另一个版本的安装程序,注册表键就不会被删除。这是什么原因呢?

1个回答

18
Windows Installer使用组件的Component / @ Guid对其进行引用计数。如果您有一个在多个MSI文件中共享的组件(即具有相同的@Guid),则只有当两个MSI均被卸载时才会删除组件的内容。

我强烈建议阅读有关组件规则的内容。它们控制所有这些问题:https://robmensching.com/blog/posts/2003/10/18/component-rules-101


非常感谢,现在它像魔法一样工作。然而,在阅读您的博客文章后,我想知道是否建议始终使用 * 作为组件 GUID? - Simon
2
如果可能的话,我建议使用 Component/@Guid="*"。WiX 工具集会告诉你什么时候不能这样做。 - Rob Mensching
如果您有一个组件(请记住,组件在MSI文件之外通过其@Guid进行标识)跨产品共享,则仅当最后一个MSI卸载时才会删除该组件。再次提醒,我上面链接的组件规则博客文章解释了原因。最后,详细日志文件将向您显示所有组件的安装状态。 - Rob Mensching
对于其他无法获取链接的人(即页面不存在),我通过尝试发现Rob给出的URL区分大小写。尝试这个链接就可以了:https://robmensching.com/blog/posts/2003/10/18/component-rules-101/ - Tam Bui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接