首页 > 解决方案 > 安装后删除有效负载的替换 MSI 的 WiX 捆绑包

问题描述

概括

我有一个正在删除升级文件的捆绑包。它正在删除它们,因为旧的 MSI 卸载在新的 MSI 安装完成后触发。

由于它们具有具有不同组件 ID 的相同文件,因此引用计数无法阻止它。

我需要确保文件在安装过程结束时存在。

历史

捆绑 mk 1

创建了具有多个 MSI 的两个捆绑包。他们共享一些 MSI,但也有自己独特的内容。

捆绑 mk 2

其中一个捆绑包已更改为具有一些替换 MSI。它不再有任何共享的 MSI。新的 MSI 具有与以前相同的有效负载和相同的功能 ID,但具有不同的升级代码和组件 ID。

问题

丢失的文件显然是从 mk1 到 mk2 的问题。如果客户从 mk1 升级到 mk2,要求客户进行维修是不切实际的。

我最初尝试将这些功能强制到本地,直到我找到卸载日志文件并发现 MSI 已经安装正常 - 只是清理出现在一个意想不到的地方。

我希望我可以更改捆绑包的顺序,但它似乎没有任何自己的安装执行顺序可以调整。

我可以检测到捆绑包何时从 mk1 转到 mk2 并尝试更改内容,但我不知道要更改什么。

也许我需要检测缓存的包并针对它执行命令行卸载?

我不希望将自定义操作放入 MSI,但如果这是解决方法,我会这样做。我希望它可以从捆绑包中修复。

考虑的选项

  1. 如果它是从 mk1 到 mk2 的升级,则让包显式执行命令行卸载先前的包。
  2. 为新的 MSI 分配新的功能 ID 并包含 mk1 MSI 的 RTM,强制 mk1 MSI 功能状态为“不存在”并确保 mk2 MSI 在 mk1 MSI 之后运行。
  3. 通过使用修复选项调用自身,在捆绑安装结束时强制修复。

实施

添加我已经制定出来的东西会起作用。它带有自己要解决的一系列新问题。

我在 DetectRelatedBundle 中获得了有关缓存包的信息。从那里我可以在以下位置之一查找注册表:

HLKM:Software\Microsoft\Windows\CurrentVersion\Uninstall\<ProductCode>
HLKM:Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<ProductCode>

这给了我缓存包在InstallSource注册表项中的位置。

在 PlanComplete 期间,我会使用缓存包的静默修改功能,告诉它删除共享功能,以便在新包将新文件放置到位之前将它们删除。

新的问题是:

标签: wixwindows-installerwix3

解决方案


推荐阅读