WiX v5下卸载HF3后如何保持HF1、HF2在控制面板隐藏?
问题:卸载HF3后HF1、HF2重新显示的解决方法
背景
基础RTM版本部署后,依次安装HF1、HF2、HF3三个热修复。安装HF3后,通过在InstallFinalize前后执行自定义操作,将HF1、HF2的SystemComponent注册表值设为1,实现这两个热修复在控制面板「程序和功能」中隐藏,仅显示RTM和HF3,安装流程符合预期。
但卸载HF3时出现异常:HF1、HF2重新在控制面板中显示。排查发现,自定义操作已将SystemComponent值正确设为0,但该值随后被删除,导致隐藏条目重新出现,不符合需求。使用WiX v5开发。
自定义操作代码片段:
<CustomAction Id="HideHotFixes" Execute="" -> Tried with immediate, commit and deferred type of custom actions DllEntry="HideandUnhideHotFixes" Impersonate="no" BinaryRef="MBACAs" />
解决方法
- 直接设置目标值而非0:卸载HF3的核心需求是保持HF1、HF2隐藏,因此无需将
SystemComponent设为0,直接在卸载流程中执行自定义操作,将HF1、HF2的SystemComponent值强制设为1,覆盖任何中间修改。 - 用WiX RegistryValue持久化注册表项:在HF3的WiX项目中,为HF1、HF2对应的卸载注册表项添加
RegistryValue元素,标记为永久,避免Windows Installer卸载时删除该值:
替换<RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[HF1_PRODUCT_CODE]"> <RegistryValue Name="SystemComponent" Type="integer" Value="1" Permanent="yes" /> </RegistryKey> <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[HF2_PRODUCT_CODE]"> <RegistryValue Name="SystemComponent" Type="integer" Value="1" Permanent="yes" /> </RegistryKey>[HF1_PRODUCT_CODE]和[HF2_PRODUCT_CODE]为对应热修复的实际产品代码。 - 调整自定义操作执行时机:将自定义操作设置为
deferred类型,放在RemoveFiles之后、InstallFinalize之前执行,确保在Windows Installer处理注册表删除操作之后修改值,避免被覆盖。同时在自定义操作中直接调用Windows API修改注册表(如RegSetValueEx),不依赖WiX的注册表表。 - 让HF1、HF2自身设置永久隐藏:修改HF1、HF2的安装包,在安装时就将自身的
SystemComponent设为1并标记Permanent="yes",这样后续HF3的修改不会影响该值的持久性,卸载HF3时也不会触发该值的删除。
内容的提问来源于stack exchange,提问作者vamshi krishna
相关产品推荐
相关产品推荐

