Wix Burn:自定义Bootstrapper升级,但与旧版本并排安装

时间:2014-02-18 13:01:28

标签: wix bootstrapper burn

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

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

Screenshot from my Add/Remove Programs palette

如果我从此处调用ver 1.0.0.0,它将显示Dialog to Install,但不会执行任何操作。但是,调用ver 1.0.1.0会让我选择卸载产品。但是,在卸载时,它只会自行删除,并且“我的产品”会被遗忘。

我也试过

_bootstrapper.Engine.Plan(LaunchAction.UpdateReplace);

_bootstrapper.Engine.Plan(LaunchAction.UpdateReplaceEmbedded);

但它没有效果。

问题:如何在不落入上述情况的情况下升级旧版安装?任何人都可以提供CustomBA升级的工作示例吗?

此致

2 个答案:

答案 0 :(得分:5)

检查PlanRelatedBundle事件。它可以告诉引擎如何处理旧捆绑包。

如果您希望Bundle替换旧的,则两者的UpgradeCode应该相同。在这种情况下,它将默认卸载旧捆绑包。 此外,旧的bundle需要支持安静的卸载,因为在安装新的bundle之后将使用参数/ quit调用它。

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

如果无法解决此问题,请检查在AppData \ Temp文件夹中创建的日志。

答案 1 :(得分:0)

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

因此旧的捆绑包没有应该卸载。

优良作法是为 Bootstrapper提供的每个事件实现一个处理程序。在每个处理程序中写一个日志条目,列出提供给处理程序的参数。它使得追逐错误变得更加容易。

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