Wix Burn:自定义引导程序升级,但与旧版本并排安装

Posted

技术标签:

【中文标题】Wix Burn:自定义引导程序升级,但与旧版本并排安装【英文标题】:Wix Burn: Custom Bootstrapper upgrade but Installs side by side with older version 【发布时间】:2014-02-18 13:01:28 【问题描述】:

我正在努力解决我的自定义引导程序升级问题。通过关注this thread,我正在使用 LaunchAction.Install。

这确实升级了产品以及 Boostrapper,但旧的 Bootstrapper 仍然存在,如下面的屏幕截图所示。

如果我从这里调用 1.0.0.0 版,它将显示要安装的对话框,但不会执行任何操作。但是,调用 1.0.1.0 版将使我可以选择卸载产品。但是,在卸载时,它只会删除自己,并且留下“我的产品”。

我也试过

_bootstrapper.Engine.Plan(LaunchAction.UpdateReplace);

_bootstrapper.Engine.Plan(LaunchAction.UpdateReplaceEmbedded);

但它没有效果。

问题:如何在不出现上述情况的情况下升级旧安装?谁能提供一个 CustomBA 升级的工作示例?

问候

【问题讨论】:

【参考方案1】:

检查 PlanRelatedBundle 事件。在这里您可以告诉引擎如何处理旧包。

如果你想要一个 Bundle 来替换旧的,UpgradeCode 应该是相同的。在这种情况下,它将默认卸载旧包。 旧包也需要支持静默卸载,因为它会在安装新包后使用参数 /quit 调用。

您可以在 BootstrapperApplication.Command.Display 属性中检查它。如果它是从另一个 Bundle 调用的,它应该是“嵌入的”。在这种情况下,BootstrapperApplication.Command.Action 设置为“卸载”。

如果这些都不起作用,请检查在 AppData\Temp 文件夹中创建的日志。

【讨论】:

WIX 本身使用自定义 BA,因此查看 WIX 源代码以了解它如何处理命令行卸载是查看示例的好地方。【参考方案2】:

我也遇到过这个问题。我必须编写自己的托管引导应用程序。我有一个错误,我在 Detect() 阶段完成之前开始了 Plan() 阶段。

因此,旧捆绑包没有按应有的方式卸载。

为引导程序提供的每个事件实现一个处理程序是一种很好的做法。在每个处理程序中写入一个日志条目,列出提供给处理程序的参数。它使追查错误变得容易得多。

在我的情况下,我从 InstallShield 2009 迁移到 WiX 3.10,我必须编写自己的托管引导程序,因为我必须根据来自精美 WPF 助推器的用户输入有条件地安装 SQL Server express。

【讨论】:

以上是关于Wix Burn:自定义引导程序升级,但与旧版本并排安装的主要内容,如果未能解决你的问题,请参考以下文章

Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面

WiX 自定义操作在 MSI 中使用 [SourceDir] 和 Burn

如何获得 Wix Burn 捆绑包以阻止升级

如何防止 wix 自定义引导程序卸载 UI 在升级过程中显示

WiX Burn - 根据条件设置 InstallFolder 变量

Wix Burn 没有将命令行参数传递给相关软件包(同一安装程序的旧版本)