Wix 3.11.1升级进入维护模式未完成,残留双程序条目
从你的描述和日志信息来看,核心问题是MajorUpgrade没有正确触发旧版本的完全卸载,导致旧版本残留并进入维护模式。下面是具体的原因分析和解决步骤:
1. 锁定日志中的关键异常
日志里这条信息是突破口:
MSI (s) (68:BC) [15:04:38:423]: Note: 1: 2203 2: C:\WINDOWS\Installer\inprogressinstallinfo.ipi 3: -2147287038
2203错误表示Windows Installer无法访问指定文件,这里的inprogressinstallinfo.ipi是MSI运行时的临时锁定文件,通常意味着之前的安装/卸载进程没有正常结束,导致文件被占用,进而干扰了旧版本的卸载流程,触发了维护模式。
2. 调整MajorUpgrade的卸载时机
你的MajorUpgrade元素缺少Schedule属性,默认的afterInstallInitialize时机可能在文件已经被新版本安装程序占用后才尝试卸载旧版本,容易触发维护模式。建议将卸载时机提前到afterInstallValidate,这样能在文件被使用前完成旧版本卸载:
修改后的MajorUpgrade配置:
<MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes" DowngradeErrorMessage="!(loc.NewerVersionInstalled)" Schedule="afterInstallValidate" />
3. 解决临时文件锁定问题
针对inprogressinstallinfo.ipi的锁定问题,按以下步骤处理:
- 重启你的电脑,强制释放被占用的文件资源
- 如果重启后问题依旧,以管理员权限手动删除
C:\WINDOWS\Installer\inprogressinstallinfo.ipi文件
4. 单独验证旧版本的卸载流程
为了排除旧版本自身的卸载问题,单独运行旧版本的卸载命令,生成详细日志排查:
msiexec /x {FC49F622-02E6-40D9-ACD9-92BDD4AF5979} /qn /l*v uninstall_old.log
查看uninstall_old.log,确认是否有自定义操作失败、文件无法删除等其他异常导致卸载进入维护模式。
5. 检查组件一致性
如果新旧版本存在共享组件,确保组件遵循MSI的组件规则:
- 组件内容变化时,必须更新组件GUID
- 组件内容不变时,保持GUID一致并递增组件版本号
错误的组件配置会导致Windows Installer认为组件需要保留,从而阻止旧版本的完全卸载。
6. 再次确认UpgradeCode的一致性
虽然你提供的UpgradeCode是相同的,但务必检查旧版本和新版本的Product元素中UpgradeCode完全一致,任何拼写错误都会导致MajorUpgrade无法检测到旧版本。
内容的提问来源于stack exchange,提问作者dgxhubbard

