Wix安装包卸载时如何自动删除所有按条件安装的货币功能组件
问题根源
你遇到的卸载两次的问题核心原因是:CURRENCY是仅安装时传入的临时属性,卸载流程不会自动保留该属性值,导致卸载时两个区域设置Feature的Level始终为默认值0,MSI判定这两个Feature未被安装,不会处理对应组件的删除,产生残留后就需要第二次卸载才能清理干净。
解决方案
方案1:修改Feature条件适配卸载场景(最简便)
直接修改每个区域Feature的安装条件,增加卸载场景的判断,全量卸载时强制将Feature Level设为1,让MSI统一处理组件删除:
把原来的条件:
<Condition Level="1">CURRENCY = "GBP"</Condition>
修改为:
<Condition Level="1">CURRENCY = "GBP" OR REMOVE ~= "ALL"</Condition>
同理US区域的条件修改为:
<Condition Level="1">CURRENCY = "USD" OR REMOVE ~= "ALL"</Condition>
其中REMOVE ~= "ALL"是MSI内置的全量卸载状态判断,~=代表不区分大小写匹配,卸载时该条件成立,对应Feature会被纳入删除流程。
方案2:持久化CURRENCY属性(适合后续逻辑需要复用该属性的场景)
将安装时传入的CURRENCY值写入注册表,卸载时自动读取,不需要修改原有Feature条件:
- 首先定义持久化属性和注册表搜索逻辑:
<!-- 卸载时自动读取注册表中存储的CURRENCY值 --> <Property Id="CURRENCY" Secure="yes"> <RegistrySearch Id="SearchCurrency" Root="HKLM" Key="SOFTWARE\你的公司名\你的产品名" Name="Currency" Type="raw" /> </Property> <!-- 安装时写入CURRENCY到注册表 --> <Component Id="RegCurrency" Guid="替换为你生成的唯一GUID" KeyPath="yes"> <RegistryValue Root="HKLM" Key="SOFTWARE\你的公司名\你的产品名" Name="Currency" Type="string" Value="[CURRENCY]" /> </Component>
- 将上述
RegCurrency组件添加到主Feature的ComponentRef列表中,随主程序一起安装即可。
内容的提问来源于stack exchange,提问作者DanielEli
相关产品推荐
相关产品推荐

