我使用WiX 3.0编写的安装程序使用RegistryValue元素来修改现有的注册表值(最初由我们的主要产品编写)。我试图找出一种方法来恢复用户卸载我的实用程序时的注册表值。我想避免使用自定义操作,但这可能是唯一的办法? TIA。
答案 0 :(得分:3)
我这样做了。有问题的注册表值是与文件扩展名关联的应用程序,但它可以是任何注册表值。
我的第一个想法是使用“自定义操作”进行安装和卸载以保留 并分别恢复相关的regy状态。这个 看起来很简单。
我在VS2008中创建了一个安装项目,并将CA构建为javascript文件。 “on install”脚本抓住了现有的regy值并将其藏匿在一个众所周知的地方。 “on uninstall”脚本将在众所周知的位置查找,然后将在此处找到的值放回原始位置。 容易,对吗?
有两个问题:
安装期间运行的脚本,用于保留预先存在的注册表值, 在注册表已更新后运行 使用新安装的东西的值。因此,它保留了新设置,而不是MSI运行之前的设置。没用。
在卸载期间运行的脚本,在注册表值之后运行,实际上是整个目录子树, 已被删除。包括藏匿价值。所以它失去了它的状态。
为了解决这个问题,我写了another script that re-orders the custom actions,以便他们在适当的时间运行。
实际上还有一个转折点。显然,“恢复”脚本(上 如果在删除应用程序的注册表项后运行它,则无法运行。我现在不记得了,为什么......但我也确定这个脚本在之前无法运行。不知怎的,这也没有用。
因此,我修改了MSI以运行恢复脚本 两次。在阶段1中,它将存储的值传输到注册表中的“停车场”。 然后注册表中的应用程序的键和值被删除,但停车场仍然存在。在 阶段2,在事务保护之外,恢复脚本从停车场检索状态,恢复 文件关联,然后删除停车场。
我不记得究竟为什么我需要分两步完成这项工作,但我记得在提出解决方案之前与它斗争了一段时间。
它在开发中的工作方式:
on install
和on uninstall
CA 使用MSI时,它比我原先想象的要复杂一点,但它有效。
如果您使用WiX,您可以更好地控制步骤的时间和顺序,因此可能不需要该后处理步骤。
最后,你说你想避开CA.对我来说,CA是可以避免的,因为它们在C ++中生成很痛苦,而在.NET中生成它们通常是不合适的。但是,使用Javascript for CA非常简单。有些人认为script is the wrong tool for the CA job。我认为这是错误的。 I think script is a very good tool for this purpose。一旦你可以接受脚本作为一个好工具,那么你就不需要专注于创建自定义CA.
答案 1 :(得分:0)
注册表在卸载期间无法编写注册表值,因此必须通过自定义操作完成此操作。我认为使用脚本很糟糕。您是否选择倾听取决于您自己。我可以告诉你,就在前几天我被召唤来解决这种情况,其中一些人写了一个失败的vbscript CA,因为文件系统对象在安全锁定过程中已经取消注册。
我建议根据您的需要使用C ++或C#/ DTF。
答案 2 :(得分:0)
面对类似问题,需要在安装时更新注册表值并在卸载时恢复到以前的值。 唯一可行的解决方案是为此目的创建自定义操作吗?
我找到了wix的扩展,为此目的有了解决方法 link to wix extensions