如何使用自定义引导程序执行 Wix 升级

2023-12-11

我想在我们的 WiX 自定义 BA 安装程序的第二版中启用升级。在我的Product.wxs中,产品ID设置为*,版本设置为2.0.0,升级代码与第一个版本相同。为了检测升级,我在 Boostrapper 中使用了 DetectRelatedBundle 事件处理程序。

MSI 中的 MajorUpgrade 标签如下所示:

<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." AllowSameVersionUpgrades="no" Schedule="afterInstallInitialize" />

在我的安装程序用户界面中,我有一个“安装”按钮。在升级场景中单击此按钮时,我会调用 PlanAction 并传递 LaunchAction.Install。但是一旦安装开始,它会显示 BA 的另一个实例,我相信这是我当前的 BA 调用的旧包来卸载旧版本。为了隐藏新的 BA 实例并仅显示安装进度,我在 Bootstrapper 中进行了以下更改:

Bootstrapper.cs:

protected override void Run()
{
    BootstrapperDispatcher = Dispatcher.CurrentDispatcher;

    try
    {
        _model = new BootstrapperApplicationModel(this);

        var uninstall = new UpgradeUninstall(_model);
        if (uninstall.IsUpgradeUninstallation())
        {
            uninstall.PerformSequence();
        }
        else
        {
            //show install or uninstall main UI

            this.WireUpEventHandlers();
            _model.BootstrapperApplication.Engine.Detect();
            Dispatcher.Run();
        }
    }
}

升级卸载.cs:

public class UpgradeUninstall
{
    private BootstrapperApplicationModel _bootStrapperModel;

    public UpgradeUninstall(BootstrapperApplicationModel model)
    {
        _bootStrapperModel = model;
    }       

    public void Perform()
    {
        this.WireUpEventHandlers();
        _bootStrapperModel.BootstrapperApplication.Engine.Detect();
    }

    public bool IsUpgradeUninstallation()
    {
        var action = _bootStrapperModel.BootstrapperApplication.Command.Action;
        var display = _bootStrapperModel.BootstrapperApplication.Command.Display;

        return action == LaunchAction.Uninstall && (display == Display.None || display == Display.Embedded);
    }

    private void WireUpEventHandlers()
    {
        _bootStrapperModel.BootstrapperApplication.DetectComplete += OnDetectComplete;
        _bootStrapperModel.BootstrapperApplication.PlanComplete += OnPlanComplete;
        _bootStrapperModel.BootstrapperApplication.ApplyComplete += OnApplyComplete;
    }

    private void OnDetectComplete(object sender, DetectCompleteEventArgs e)
    {
        this._bootStrapperModel.PlanAction(LaunchAction.Uninstall);
    }

    private void OnPlanComplete(object sender, PlanCompleteEventArgs e)
    {
        this._bootStrapperModel.ApplyAction();
    }

    private void OnApplyComplete(object sender, ApplyCompleteEventArgs e)
    {
        BootstrapperDispatcher.InvokeShutdown();
    }
}

问题 1) 我如何让我的主 BA 实例(进行安装的实例)知道旧包的卸载已完成?现在发生的情况是,它能够成功卸载旧软件包,但没有执行新版本的安装。

问题2)我对WiX升级的理解是否正确? :)


发生的情况是您的旧 BA 在静默模式下通过卸载开关被调用。我可以看到您的代码确实有一些处理命令行卸载的管道,尽管我看不到您在哪里调用 Engine.Plan(LaunchAction.Uninstall)。

Q1) 我不认为你需要做任何特别的事情来让你原来的 BA 知道你已经完成了。您只需以正常方式退出安装即可。

Q2) 是的,我想你已经快到了。我建议你从 git 下载 WIX 源代码,看看它是如何实现自定义 BA 的。具体看DetectComplete代码:

private void DetectComplete(object sender, DetectCompleteEventArgs e)
{
    // Parse the command line string before any planning.
    this.ParseCommandLine();
    this.root.InstallState = InstallationState.Waiting;

    if (LaunchAction.Uninstall == WixBA.Model.Command.Action)
    {
        WixBA.Model.Engine.Log(LogLevel.Verbose, "Invoking automatic plan for uninstall");
        WixBA.Plan(LaunchAction.Uninstall);
    }

您可以看到它正在检查卸载命令行选项并立即开始卸载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用自定义引导程序执行 Wix 升级 的相关文章

随机推荐

  • Windows Phone - Phonegap 推送通知 - 注册我的设备后无法获取 URI

    我在用推送插件在我的 wp8 的 cordova phonegap 应用程序中 我自动安装了插件 cordova plugin add https github com phonegap build PushPlugin git 当我的设备
  • 将 typeahead.js 输出到多个文本框中

    我正在为我的公司开发一个内部 Web 表单 我试图使用 typehead js 从本地数组加载名称 我能够毫无问题地执行此操作 但是任务的第二部分是当在第一个文本框中选择员工姓名时 将该员工的 ID 放入第二个文本框中 我无法成功地将值输出
  • jQuery 存储和检索表单状态(带数据)

    有什么方法可以将表单状态存储在例如 cookie 中并检索它吗 我检查了序列化API但我不知道如何检索表单上的序列化数据 是否可以 Update 我把我的代码here 检查 End of cookie 插件后的 javascript 代码
  • 解决“找不到资源”的问题。错误

    我有一个 MVC 3 应用程序 其中内置了几个区域 其中一个区域是我网站的管理部分 一切都工作得很好 我想尝试 MvcContrib Portable Areas 以使我的应用程序更加模块化 因此我安装了 MvcContrib 经过一番尝试
  • 实体框架 4 / POCO - 从哪里开始? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我已经编程了一段时间 并且之前使用过 LINQ To SQL 和 LINQ To Entities 尽管在使用实体时它一直处于实体 表 1 1 关系上 即与 L2SQL 没有太大区别
  • Pebble 手表开发教程中的这个点语法是什么意思? [复制]

    这个问题在这里已经有答案了 我在 Pebble 手表应用程序开发教程中遇到了以下代码 Set handlers to manage the elements inside the Window window set window handl
  • 我可以检测窗口是否部分隐藏吗?

    是否可以检测我的外部程序的窗口是否 1 完全可见 2 部分隐藏或 3 完全隐藏 如果窗口 基于检索到的句柄 不可见 我希望能够告诉我的应用程序不要执行任何操作 我不关心窗口是否有焦点 z 顺序是什么 或者其他什么 我只关心窗口显示了多少 如
  • 使用 Amazon API MWS 进行签名查询

    我正在尝试向卖家亚马逊网络服务 MWS 提出签名请求 我正在使用这里的脚本 将亚马逊 MWS 暂存器查询转换为 API 调用 但我不知道为什么会出现错误 我们计算的请求签名与您提供的签名不匹配 请检查您的 AWS 秘密访问密钥和签名方法 有
  • 在运行时实现接口

    是否可以使已编译的类在运行时实现某个接口 例如 public interface ISomeInterface void SomeMethod public class MyClass this is the class which i w
  • pySerial write() 在 Python 解释器中工作正常,但在 Python 脚本中不行

    最近 我正在尝试在Arduino上进行某种 灯光控制 我使用 Raspberry Pi 通过串口 USB 电缆 发送控制消息 这是 Arduino 代码 int redled 12 int whiteled 48 void setup Se
  • R - 如果日期在范围内,则求和

    我已经设法在 excel 中轻松完成此操作 但想在 R 中完成此操作 我有两个数据框 MediaPlanDF 215 个 obs 29 个 var 我只关心其中的 4 个变量 开始日期 航班日期 结束日期 航班日期 每日消费 每日展示次数
  • 如何修复 Findbugs HTTP 参数直接写入 HTTP 标头输出

    我有一个类 RequestFilter 和 Override 方法 doFilterInternal 当我添加响应标头时 findbugs 显示直接写入 HTTP 标头输出的错误 HTTP 参数 那么我该如何解决这个问题呢 谢谢大家 Str
  • sql 如何将两个表的三个查询合并为一个查询

    我有以下两个表 Table1 id name A3 B2 A3 B400 A5 B100 A7 B200 A8 B6 A8 B2 A8 B3 and Table2 id name company A1 company1 A2 company
  • Jquery基于滚动翻译元素

    我正在尝试重现发现的效果这一页 所以我们的想法是 当用户滚动时 选项卡就会显示出来 我对此的看法是使用 jquery 沿着滚动条翻译它们 我的问题是 我给了他们特定的滚动区域 在此期间它们将被翻译 但如果滚动 跳 出该区域 它们将保持在原来
  • 如何在 iOS 7 的 UIAlertView 中添加子视图?

    我在 iTunes 商店中有一个应用程序 它显示一些UILabel and UIWebView on UIAlertView 根据会议视频显示 addSubView for UIAlertView不管用 他们谈论过ContentView 但
  • PHP:通过 ClassName::method 语法调用实例方法,会导致静态调用吗?

    她是我的代码 class MyClass public prop public function method echo this gt prop 然后在代码中的某个地方 意外地 MyClass method 我预计上面的行会出现解释错误
  • IsPersistent 不起作用 PasswordSignInAsync Identity asp.net core

    我在我的网站中使用 dotnet core 5 和 Identity 进行授权 我有一个自定义课程User为了我的身份 这是我的配置服务 services AddDbContext
  • 使用 Parse iOS 登录 Facebook 和 Twitter 只能运行一次

    我在 Parse SDK 中使用 twitter 和 Facebook 登录 对于每个应用程序启动 我都可以登录每个服务一次 但是当我使用 PFUser logOut 注销时 我无法再次登录 PFFacebookUtils logInWit
  • C# 使 winform readonly radioButton 看起来像标准的

    简单的问题 如果我在 winform 项目中设置一个单选按钮 它的外观 字体颜色 将更改为浅灰色 当我将其启用属性设置为 false 时也是如此 我怎样才能创建一个看起来像普通按钮的只读单选按钮 因为这样你几乎看不到它 Thanks 作为一
  • 如何使用自定义引导程序执行 Wix 升级

    我想在我们的 WiX 自定义 BA 安装程序的第二版中启用升级 在我的Product wxs中 产品ID设置为 版本设置为2 0 0 升级代码与第一个版本相同 为了检测升级 我在 Boostrapper 中使用了 DetectRelated