我在Visual Studio中有一个安装项目。作为常规安装的一部分,它会在Windows注册表中创建/更新某些键和值。如何使更新可逆?
你可能会说“他们是可逆的”,但我不这么认为。以下是我认为它的工作原理:使用VS设计器指定您想要的注册表项和值。这些键和值在安装期间写入,在卸载期间删除。简单。什么不可逆?
当安装期间写入的某个键中存在现有值时,会出现此问题。假设它的值为1.然后使用新安装它获得值100.卸载后,它根本没有值 - 值已经消失。
我尝试使用“自定义操作”解决此问题。
在安装过程中,如果用户确认,则msiexec会将值写入注册表。无论之前注册表项中的内容是什么,都消失了。 (我们称之为“更新A”)
要保留该值,在安装时,会有一个自定义操作,用于读取和保留“之前”设置。它在“更新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中的构建后步骤运行。
自定义操作的排序是否类似?
答案 0 :(得分:1)
我的一些答案:
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自动化更改。