回滚到以前版本的 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)引导程序项目中将按钮文本更改为“升级”?

Wix 安装程序有选择地卸载以前的版本

Wix 安装程序不会覆盖以前版本的可执行文件

从 Wix Bootstrapper Bundle 检查文件版本

如何在wix中将属性传递给回滚自定义操作?

WiX MSI:将演示项目与安装程序捆绑在一起