VS安装项目;如何在卸载时恢复注册表值?

问题描述 投票:1回答:1

我在Visual Studio中有一个安装项目。作为常规安装的一部分,它会在Windows注册表中创建/更新某些键和值。如何使更新可逆?

你可能会说“它们是可逆的”,但我不这么认为。以下是我认为它的工作原理:使用VS设计器指定您想要的注册表项和值。这些键和值在安装期间写入,在卸载期间删除。简单。什么不可逆?

当安装期间写入的其中一个键中存在现有值时,会出现此问题。假设它的值为1.然后使用新安装它获得值100.卸载后,它根本没有值 - 值已经消失。


我尝试用“自定义操作”来解决这个问题。

在安装期间,如果用户确认,则msiexec将值写入注册表。无论之前注册表项中的内容是什么,都消失了。 (我们称之为“更新A”)

为了保留该值,在安装时,会有一个自定义操作,用于读取和保留“之前”设置。它在“Update A”之前运行。到现在为止还挺好。

在卸载时,正常的操作过程是删除在安装期间添加的常规注册表项和值。这很好用。将此称为“更新B”。

要恢复原始注册表值,我有另一个“自定义操作”。这个在uninstall上运行。它成功将原始值还原到注册表中。注册表看起来就像原始安装之前一样。我验证了这可以使用ProcMon(一种让我监视注册表更新的工具,以及其他内容)。将此称为“更新C”。

只有一个问题。在卸载时,更新B发生在更新C之后。这意味着,在自定义操作恢复原始注册表设置后,msi会清除恢复的值,就像它对所有其他注册表更新一样。

结果是注册表具有空值而不是已还原的值。

有帮助吗?如何重新订购更新?我需要Orca吗?我真的不想安装和学习另一种工具来实现这一目标。我也希望它是自动的。绝对不希望在视觉上点击MSI编辑器来实现这一点。


我可以使用使用WindowsInstaller.Installer类的Javascript post-build事件吗? Aaron Stebner published a script添加了“安装后启动应用程序?”对话框到Visual Studio生成的MSI。 Windows Installer支持“启动应用程序”功能,但在VS2008 / 2005的设计器中未公开。在“启动”对话框中添加了一个快速生物板脚本,作为VS中的构建后步骤运行。

自定义操作的顺序是否可能类似?

visual-studio installation setup-project orca
1个回答
1
投票

一些答案对我来说:

  • 是的,可以通过在Javascript中实现的postbuild步骤来执行此操作。
  • 是的,我使用WindowsInstaller.Installer类。
  • 是的,逆戟鲸有必要把它弄清楚

Orca清楚地显示了用于恢复注册表值的自定义操作在删除注册表值的内置操作之前运行。

orca

所以我必须编写一个脚本来将1698更改为2620,并且应该正确恢复注册表值。


编辑:没那么快。这个想法是对的,但并不像改变序列号那么简单。问题是,“保留的”注册表值位于注册表树中,由卸载程序删除。因此,订单都不起作用。如果A是还原,而B是删除,则A-B将仅还原注册表以使以后删除的还原值。 B-A将首先删除该值,然后A将没有值可以恢复。原因是A(恢复部分)将要恢复的值存储在要删除的树中。

因此,正确的操作必须是像A-B-A, where A获取存储的值以进行恢复,并将其置于不会被B删除的位置。然后B删除注册表中特定于应用程序的键和值。 A恢复被A`吸走的设置。

为了实现这一切,我不得不对MSI文件进行一些手术,因为Visual Studio中的vanilla MSI设计器不允许设置特定的序列号。你需要使用Orca,这是一个GUI工具,或者,在我的情况下,我使用COM接口到WindowsInstaller来通过javascript自动化更改。

© www.soinside.com 2019 - 2024. All rights reserved.