WiX安装程序在重建后不显示卸载对话框



在我的自定义WiX 3.7安装程序中有一个安装和卸载对话框。这来自我的自定义Bootstrapper应用程序。当我的软件没有安装并且我启动安装程序时,它会显示安装对话框。当安装完成并启动安装程序时,它会显示卸载对话框(一个自定义对话框)。

当我现在重新构建安装程序而不更改WiX安装程序项目中的任何内容并在安装软件时启动安装程序时,它不再显示卸载对话框。相反,它显示安装对话框。

在Bootstrapper的DetectBegin方法中检查应用程序是否安装。但是,当我点击安装时,它意识到它已经安装了,并中止了这个过程。

为什么会发生这种行为?引导程序是否检查它是否已安装以决定显示哪个对话框?所以它认为它是一个不同的引导器,因为它是重建的吗?

如果是这样,我如何使Bootstrapper显示卸载对话框时,我的应用程序与相同的版本已经安装?我必须加上一些条件吗?

如果没有更多关于WiX/MSI和bundle设置的信息,将会有一些猜测,但是:

MSI中的ProductCode决定产品是否已安装。不可能在相同的上下文中(比如每台机器)安装两次相同的产品(代码)。根据定义,它已经安装了,因此试图再次安装它会导致它进入维护模式,显然唯一的选择是卸载对话框。

如果你在不改变任何东西的情况下重建MSI,如果你有Product Id="*",那就不一样了,因为这意味着ProductCode会在你构建的时候改变,所以会有一个新的产品,因为它没有安装在系统上,你会得到一个安装对话框。

所以我怀疑你需要在你的MSI中添加一个MajorUpgrade元素,以便你的新MSI具有递增的ProductVersion,相同的UpgradeCode和新文件将升级旧产品。

引导程序的工作原理类似,因为它是包装MSI的产品包,所以您可能也需要一个增量的捆绑包版本,以便MSI升级以及捆绑包基础设施(可能拥有programs&Features条目)。

我找到了一个解决方案。显然,Bundle ID对于每个构建都是唯一的,并且不可能设置它。这就是为什么在重建时,Bootstrapper回调函数DetectBegin的DetectBeginEventArgs中的Installed属性设置为false。这就是我决定显示安装或卸载对话框的地方。

我现在额外使用"DetectRelatedBundle"回调。这里,"DetectRelatedBundleEventArgs"的"Operation"属性被设置为"RelatedOperation"。

如果安装了相同版本、产品码和升级码的应用。

最新更新