我使用 WiX 3.0 编写的安装程序使用 RegistryValue 元素来修改现有注册表值(最初由我们的主要产品编写)。我正在尝试找出一种在用户卸载我的实用程序时恢复注册表值的方法。我想避免使用自定义操作,但这可能是唯一的办法? TIA。
最佳答案
我做到了。有问题的注册表值是与文件扩展名关联的应用程序,但它可以是任何注册表值。
我的第一个想法是使用“自定义操作”进行安装和卸载以保留 并分别恢复相关的注册状态。这个 看起来很简单。
我在 VS2008 中创建了一个安装项目,并将 CA 构建为 javascript 文件。 “on install”脚本获取现有的 regy 值并将其存储到一个众所周知的地方。 “卸载时”脚本会在众所周知的地方查找,然后将在那里找到的值放回原始位置。 容易,对吧?
有两个问题:
在安装过程中运行的脚本,用于保留预先存在的注册表值, 在注册表已更新后运行 使用新安装的东西的值。因此它保留了新设置,而不是 MSI 运行之前的设置。没用。
卸载期间运行的脚本,在注册表值之后运行,实际上是整个目录子树,
已被删除。包括隐藏的值(value)。所以它失去了它的状态。
为了解决这个问题,我写了 another script that re-orders the custom actions所以他们在适当的时间运行。
实际上还有一个转折点。显然,“恢复”脚本(在 uninstall) 如果在应用程序的注册表项被删除后运行,它将不起作用。我现在不记得,为什么...但我还确定此脚本在那之前 无法运行。不知何故,这也不起作用。
所以,我修改了 MSI 来运行恢复脚本 两次。在第 1 阶段,它将隐藏的值转移到注册表中的“ parking 场”。 然后应用程序在注册表中的键和值被删除,但 parking 场仍然存在。在 阶段 2,在事务保护之外,恢复脚本从 parking 场检索状态,恢复 文件关联,然后删除 parking 场。
我不记得为什么我需要分两步来做这个,但我记得在提出这个解决方案之前与它斗争了一段时间。
它在开发中的工作方式:
- 在 VS 项目中设置
on install
和on uninstall
CA - 构建 VS 安装项目
- 运行修改 MSI 的后处理脚本。
当使用 MSI 时,它比我原先想象的要复杂一点,但它确实有效。
如果您使用的是 WiX,您可以更好地控制步骤的时间和顺序,因此可能不需要后处理步骤。
最后,您说您想避免 CA。对我来说,避免使用 CA 是因为用 C++ 生成它们很痛苦,而用 .NET 生成它们通常是不合适的。但是,为 CA 使用 Javascript 非常简单。有人认为script is the wrong tool for the CA job .我认为这是错误的。 I think script is a very good tool for this purpose .一旦您可以接受脚本作为一个很好的工具,那么您就不需要对创建自定义 CA 嗤之以鼻。
关于wix - 我的 WiX 卸载如何恢复注册表值更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2518306/