2010-07-23 76 views
5

我已经创建了一个条件为DISABLEMSIUPGRADE的组件,当我使用我们的ExternalUI安装MSI时它会被设置。但是,MSI不会删除UnInstall上的条目。我认为问题是由条件引起的,但我无法修复。WiX在卸载时不会删除注册表键

<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元素不是原因。我看起来像是如果我安装了另一个版本的安装程序,注册表项不会被删除。什么可能导致?

回答

12

Windows Installer引用通过其组件/ @ Guid对组件进行计数。如果跨MSI文件共享Component(即具有相同@Guid的组件),则只有在卸载了两个MSI时,组件的内容才会被删除。

我强烈推荐阅读组件规则。他们控制所有这些:http://robmensching.com/blog/posts/2003/10/18/Component-Rules-101

+0

非常感谢你,它现在就像一个魅力;)。然而,在阅读您的博客文章后,我想如果建议始终使用*作为组件guid? – Simon 2010-07-26 06:25:38

+1

如果可能,我建议使用Component/@ Guid =“*”。 WiX工具箱会告诉你什么时候不能。 – 2010-07-26 15:45:33

1

如果您有一个组件(记住MSI文件之外的@Guid标识组件),则只有在最后一个MSI卸载时才会删除该组件。再次,我上面链接的Component Rules blog entry解释了原因。

最后,详细的日志文件将显示您所有组件的安装状态。

+0

非常感谢您提供这些额外信息。在您发布您的链接之前,我从未遇到过这些规则。我想知道为什么我的其他组件一直都被成功删除,即使它们都有固定的Guid。不过,我已经改变了每个Guid *,现在一切都像魅力一样运作)。 – Simon 2010-07-28 08:45:31

相关问题