我正在努力应对自定义引导程序升级问题。通过关注this thread,我正在使用LaunchAction.Install。
这会升级产品以及Boostrapper,但较旧的Bootstrapper仍然存在,如下面的屏幕截图所示。
如果我从此处调用ver 1.0.0.0,它将显示Dialog to Install,但不会执行任何操作。但是,调用ver 1.0.1.0会让我选择卸载产品。但是,在卸载时,它只会自行删除,并且“我的产品”会被遗忘。
我也试过
_bootstrapper.Engine.Plan(LaunchAction.UpdateReplace);
和
_bootstrapper.Engine.Plan(LaunchAction.UpdateReplaceEmbedded);
但它没有效果。
问题:如何在不落入上述情况的情况下升级旧版安装?任何人都可以提供CustomBA升级的工作示例吗?
此致
答案 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。