我的安装程序必须将值附加到现有的多字符串注册表项(HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ LSA \ Notification Packages):
<RegistryKey Id='RegistryEntry' Root='HKLM' Key='SYSTEM\CurrentControlSet\Control\Lsa' Action="createAndRemoveOnUninstall">
<RegistryValue Type='multiString' Name='Notification Packages' Value='p1' Action='append'/>
</RegistryKey>
问题是,在卸载时,它正在删除整个键:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ LSA ie。 LSA下的所有值都被删除了,有什么方法可以删除我附加的值(只有p1)并保留现有值?
答案 0 :(得分:2)
WiX的<RegistryKey>
元素的文档说(强调我的):
createAndRemoveOnUninstall
安装父组件时,如果不存在,则创建密钥 然后在父项时删除包含其所有值和子项的键 组件已卸载。请注意,此值仅在您的时候有用 程序会在此键下创建其他值或子键 想要卸载以删除它们。 MSI已删除所有值和 它创建的子键,因此该选项只会增加额外的开销 卸载。
Additional evidence表明上述行为适用于多字符串值:安装程序引擎将自动删除卸载时附加的值,并保留安装前存在的值。
因此,使用create
代替createAndRemoveOnUninstall
可以做您想做的事情:
<RegistryKey Id="RegistryEntry" Root="HKLM"
Key="SYSTEM\CurrentControlSet\Control\Lsa"
Action="create">
<RegistryValue Type="multiString" Name="Notification Packages"
Value="p1" Action="append" />
</RegistryKey>