如何在安装 WiX Bundle 时避免卸载以前安装的 ExePackage(可再发行文件)?

Posted

技术标签:

【中文标题】如何在安装 WiX Bundle 时避免卸载以前安装的 ExePackage(可再发行文件)?【英文标题】:How to avoid uninstalling previously installed ExePackage (redistributables) while installing a WiX Bundle? 【发布时间】:2013-09-03 23:59:03 【问题描述】:

我有一个可以安装和卸载 VC 2012 redist 的 Bundle。如果之前没有安装 VC 2012 redist,它工作正常。如果已经安装了 VC 2012 redist,那么在卸载我的包时,它也会卸载 VC 2012 redist。 我想要的是它不能卸载以前安装的 VC 2012 redist。我试图使用将持久属性设置为“是”的变量元素。但我不确定它是如何工作的。非常感谢任何指向此的指针。

【问题讨论】:

如果我的捆绑软件正在安装它,我不希望它永久存在。我想在安装时删除它,但在已安装时不要删除它。 【参考方案1】:

捆绑包可以引用计数包含的包。从WixDependencyExtension 添加一个Provides 元素,使用相同Provides 元素的Bundle 将更正引用计数。

不幸的是,VCRedist 没有记录标准的Provides 键,因此没有真正的方法来正确引用计数包。因此,VCRedist 团队希望您将其标记为永久。

【讨论】:

谢谢罗伯。有没有一种方法可以让变量存储信息,无论捆绑包是否安装了包?到目前为止,我通过创建 2 个名为 pre 和 post 的未命中并在 vc redist 2012 包之前和之后集成到包中来解决问题。 pre 写入一个注册表变量,说明之前安装了或未安装weather vc redist。我在 vc redist 包的检测条件中使用此注册表。现在因为检测条件会在卸载时卸载包。 现在,如果 pre 检测到 vc redist 并将注册表设置为 true,则 Post msi 会将注册表更改为一个值,该值对于卸载时的 vc redist 检测条件为 false。这就是我现在的做法。 它现在正在为我的目的服务,但使 vc redist 永久化是一个不错的选择。但我在考虑除了 vc redist 包之外需要卸载并使用这种方法。【参考方案2】:

您是否使用ExePackage 元素来安装redist?

如果是这样,您可以设置一个“永久”元素,以防止在删除捆绑包时将其卸载。

【讨论】:

感谢您的回答。但是如果我的捆绑包正在安装它,我不希望它是永久性的。我想在安装时将其删除,但在已安装时不要将其删除。是否可以使用永久属性? 看起来“permanent”属性只能防止软件包被卸载。如果软件包已经存在,则可以使用 DetectCondition 和 InstallConditions 不安装该软件包。您必须进行测试,但我认为引导程序不会卸载它最初未安装的软件包。 但是 - 你这样做真的会让自己陷入困境。想象一个场景,你的引导程序是第一个安装 redist 的。然后用户安装另一个也需要 redist 的程序。如果用户卸载你的程序,那么它也会删除 redist,这会破坏第二个程序。 Aaron Stebner 建议不要删除 redist。包,因为它可能被其他程序使用。这是一个非常古老的讨论(2008 年),但请阅读此处的 cmets 了解更多信息:blogs.msdn.com/b/astebner/archive/2007/02/07/… 我认为引导程序不记得根据我的测试安装了什么。 DetectCondition 似乎对于卸载是强制性的。如果未提供或评估为 false,则不会发生 redist 卸载。如果它评估为 true,那么即使它没有安装它也会卸载 redist.... :(... 永久保留 redist 很好,但我的要求是如果它是由我安装的,则不要保留它。

以上是关于如何在安装 WiX Bundle 时避免卸载以前安装的 ExePackage(可再发行文件)?的主要内容,如果未能解决你的问题,请参考以下文章

卸载升级时如何摆脱wix中未使用的dll

Wix 安装程序有选择地卸载以前的版本

具有自定义安装位置的 Wix 捆绑卸载包

如何实现 WiX 安装程序升级?

如何使用 wix 在卸载时编写注册表项

如何在 WiX 中执行仅在安装或卸载时执行的自定义操作?