WiX构建MSI卸载触发upgrade-conf.exe报1603错误的解决咨询
问题分析
当前自定义操作仅指定了执行顺序为After="InstallFiles",未添加执行条件,导致卸载流程中该操作仍会被触发。而卸载时upgrade-conf.exe已被MSI删除,执行时会因找不到文件抛出0x80070002(文件不存在)错误,最终引发1603安装失败码。
解决方案
给自定义操作添加执行条件,限制其仅在安装(含首次安装、升级)阶段运行,卸载时直接跳过。核心是利用MSI内置属性控制执行时机:
REMOVE="ALL":标识当前正执行完整卸载流程NOT REMOVE="ALL":排除卸载场景,仅在安装/升级时执行
修改后的代码示例
只需在InstallExecuteSequence的Custom元素中添加Condition属性:
<SetProperty Id="PostInstallUpgrade" Before="PostInstallUpgrade" Sequence="execute" Value =""[RMS_SERVICE]upgrade-conf.exe"" /> <CustomAction Id="PostInstallUpgrade" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="deferred" Return="check" Impersonate="no" /> <InstallExecuteSequence> <!-- 添加Condition属性,排除卸载场景 --> <Custom Action="PostInstallUpgrade" After="InstallFiles">NOT REMOVE="ALL"</Custom> </InstallExecuteSequence>
如果需要在产品升级时也执行该配置升级操作,可将条件调整为:
<Custom Action="PostInstallUpgrade" After="InstallFiles">(NOT Installed) OR (UPGRADINGPRODUCTCODE)</Custom>
NOT Installed:首次安装时执行UPGRADINGPRODUCTCODE:产品被升级(如Major Upgrade)时执行
验证效果
修改后重新编译MSI:
- 首次安装:正常执行
upgrade-conf.exe - 卸载:自定义操作被跳过,无报错
- 升级(若配置对应条件):正常执行配置升级
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

