如何用ARPentry检测卸载ExePackage?WiX4 Burn技术求助
WiX4 Burn中ARPentry元素的Id属性说明及问题解决
ARPentry的Id属性到底是什么?
- ARPentry的
Id属性对应的是Inno Setup生成的卸载项在注册表中的唯一键名——就是你在HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall(64位系统)或HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall(32位系统)下看到的那个类似{12345678-1234-1234-1234-1234567890AB}的随机字符串键,绝对不是程序的显示名称。
为什么之前的尝试没生效?
从你提供的日志来看,Burn检测到PreReq.Setup.exe的状态是Absent,说明ARPentry的检测逻辑没匹配到已安装的卸载项,问题大概率出在Id的取值上:
- 用显示名称的话,Burn根本找不到对应的注册表项;
- 如果填的注册表键名有误(比如大小写错了、字符漏了),也会导致检测失败,Burn会认为该包没安装,自然不会执行卸载动作。
正确的配置步骤
- 定位目标注册表键:
- 打开注册表编辑器,找到对应Inno程序的卸载键(路径看系统位数);
- 通过键下的
DisplayName值确认是目标程序,复制这个键的完整名称。
- 配置WiX Bundle:
<Bundle> <Chain> <PackageGroupRef Id="PreReqPackageGroup" /> </Chain> </Bundle> <Fragment> <PackageGroup Id="PreReqPackageGroup"> <ExePackage Id="PreReq.Setup.exe" SourceFile="PreReq.Setup.exe" Permanent="no" /> <ARPentry Id="{ABCDEFGH-1234-5678-90AB-CDEF01234567}" Name="你的PreReq程序名称" /> </PackageGroup> </Fragment>- 注意:
ARPentry必须和对应的ExePackage放在同一个PackageGroup里,Burn才能关联两者。
- 注意:
- 验证效果:
重新编译Bundle后执行卸载,Burn会通过这个注册表键找到Inno的卸载程序路径,自动完成卸载。
日志补充说明
日志里的state: Absent意味着Burn没检测到该包的安装状态,所以计划动作是execute: None,没有卸载操作。正确配置Id后,Burn会检测到state: Present,进而生成卸载计划。
内容的提问来源于stack exchange,提问作者Duan Bailey
相关产品推荐
相关产品推荐

