如何防止 WiX 自定义引导程序在升级时卸载丢失的包

How to prevent WiX custom bootstrapper to uninstall missing packages when upgrading

我有一个 WiX 自定义引导程序,它安装了几个 msi 包,比方说包 A、B、C、D 和 E。现在我想分发一个新的引导程序来升级包 A 和 B 但不再安装包 C , D 和 E。问题是我想把包 C、D 和 E 留在机器上(如果已经存在的话)。

升级时,Bootstrapper会install/upgrade打包A和B,然后卸载旧的Bootstrapper进行清理。这将卸载软件包 C、D 和 E,因为它们不再是产品的一部分。

问题:如何防止软件包 C、D 和 E 被卸载?

@Shique:如果包(C、D 和 E)不再包含在 Bootstrapper 中,您将永远不会在这些包上点击 OnPlanPackageBegin,因此无法将状态 属性 设置为 RequestState.None.

这不是对问题的直接回答,而是一种从引导程序中删除您不想再分发的包而无需卸载包的方法。

我们创建了第二个包含包 C、D 和 E 的 Bootstrapper。在我们原来的 Bootstrapper 中,现在只包含包 A 和 B,我们将第二个 Bootstrapper 添加为 ExePackage,并打开了 Permanent 属性。 当 运行 升级原始引导程序时,它将升级包 A 和 B,运行 第二个引导程序,这将增加包 C、D 和 E 的引用计数。当引导程序开始清理时,它由于第二个 Bootstrapper 的引用,当然会留下包 A 和 B,但也会留下包 C、D 和 E。

如果包C、D、E没有嵌入(压缩)在第二个Bootstrapper中,记得将它们作为Payload添加到ExePackage中。

这样我们仍然可以通过Apps & features来处理打包C、D和E,用户可以选择卸载这些包的时间。