回滚到以前版本的 WiX 捆绑安装程序
Posted
技术标签:
【中文标题】回滚到以前版本的 WiX 捆绑安装程序【英文标题】:Rollback to previous version of WiX bundle installer 【发布时间】:2016-01-15 16:10:45 【问题描述】:我有两个 msi 包的 WiX 包:A 和 B。起初,我成功安装了包版本 1.0.0.0。 然后我正在安装 MajorUpgrade 版本 2.0.0.0。包 A 已成功升级。包 B 升级失败并开始回滚。
我将 msi 包升级定义为:
<MajorUpgrade AllowSameVersionUpgrades="yes" Schedule="afterInstallInitialize" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
包 B 恢复到版本 1.0.0.0。包 A 通过删除回滚。因此,捆绑包仍处于不一致状态。
如果更新失败,我需要将整个捆绑包恢复到版本 1.0.0.0。有可能吗?
【问题讨论】:
我发现了关于同一问题的讨论:here 和 here 它需要 WiX 目前不支持的多 MSI 事务。 【参考方案1】:没有标准的方法来完成它,因为 WiX 不支持多 MSI 事务。
我找到了适合我的解决方法。我使用 Custom Bootstrapper Application,所以我可以在 C# 代码中处理失败事件。如果您使用 WiX 标准引导程序应用程序 (WiXStdBA),它将无济于事。
如果更新失败,我会以静默修复模式从 Windows 包缓存中调用以前的包安装程序。它恢复以前的状态。
接下来的代码表达思路:
Bootstrapper.PlanRelatedBundle += (o, e) => PreviousBundleId = e.BundleId; ;
Bootstrapper.ApplyComplete += OnApplyComplete;
private void OnApplyComplete(object sender, ApplyCompleteEventArgs e)
bool updateFailed = e.Status != 0 && _model.InstallationMode == InstallationMode.Update;
if (updateFailed)
var registryKey = string.Format("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\0", VersionManager.PreviousBundleId);
RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(registryKey)
?? RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(registryKey);
if (key != null)
string path = key.GetValue("BundleCachePath").ToString();
var proc = new Process();
proc.StartInfo.FileName = path;
proc.StartInfo.Arguments = "-silent -repair";
proc.Start();
proc.WaitForExit();
【讨论】:
以上是关于回滚到以前版本的 WiX 捆绑安装程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在升级过程中运行捆绑包时,如何在WIX(Windows安装程序xml)引导程序项目中将按钮文本更改为“升级”?