Wix(Wixsharp)多Bundle共享不同版本MSI的卸载依赖问题求助
针对你遇到的Burn引擎在共享MSI版本升级后,旧Bundle依赖失效的问题,可通过以下几种方案解决:
1. 优化Aux.msi的升级配置,绑定UpgradeCode而非特定版本
在每个Bundle的项目中,对Aux.msi的引用不要限定具体版本,而是指定其UpgradeCode。Burn会识别同一UpgradeCode的MSI为同一组件的不同版本,升级时会自动更新所有关联Bundle的依赖标记,而非仅保留新版本Bundle的依赖。
具体配置示例:
<MsiPackage SourceFile="Aux.msi" UpgradeCode="YOUR_AUX_UPGRADE_CODE_GUID" />
同时确保Aux.msi的Upgrade表配置正确,让Windows Installer在升级时处理版本替换而非完全卸载旧版本。
2. 将Aux.msi封装为独立Bundle,通过Bundle依赖管理
把Aux.msi单独打包成一个独立的Burn Bundle(如AuxBundle),然后让Bundle1和Bundle2都通过<BundleRef>依赖这个AuxBundle,而非直接包含Aux.msi。这种方式下,AuxBundle的升级会由Burn统一管控,所有依赖它的Bundle都会自动同步依赖关系,卸载时只有当所有依赖Bundle都被移除后,AuxBundle才会被卸载。
配置示例:
在Bundle1和Bundle2的项目中添加:
<BundleRef Id="AuxBundle" Version="[MINIMUM_REQUIRED_VERSION]" />
3. 为Aux.msi设置共享组件标记
如果Aux.msi的核心功能没有破坏性变更,可将其核心组件设置为Shared=Yes,并保持组件Guid在不同版本中一致。这样Windows Installer会将不同版本的Aux视为同一个共享组件,升级时会保留所有Bundle的依赖关联,避免旧Bundle出现无效依赖。
注意:此方案仅适用于组件功能兼容的版本升级,若新版本组件有破坏性变更,可能导致运行异常。
4. 临时修复方案(仅用于应急)
若无法修改安装包,可在卸载Bundle2后手动清理Bundle1的无效依赖:
- 打开注册表编辑器,定位到
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,找到Bundle1对应的条目,删除或修改指向旧版本Aux.msi的依赖项 - 或在
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products下找到旧版本Aux的相关条目,清理无效的Bundle关联记录
内容的提问来源于stack exchange,提问作者Grigoriy

