我们目前正在生产一个 MSI(例如 Broker.msi)。作为安装的一部分,MSI(在 Wix 中定义)创建一个新的注册表项(Broker)并在其下添加 2 个子项。安装后,当用户注册我们的产品时,“Broker”下会添加 1 个名为“Key3”的注册表项 节点。请注意,“Key3”包含注册 key ,该 key 非常重要并且可以被产品的其他层访问。
[安装和注册后的注册表结构]
HKLM\Software\Microsoft\Broker
Key1(由安装程序添加)
Key2(由安装程序添加)
Key3(用户注册产品时添加)
[Wix 代码片段]
<Component Id="RegistryEntries" Guid="*" Win64="$(var.WIN64_COMPONENT)">
<RegistryKey Root="HKLM" Key="Software\Microsoft\Broker" Action="createAndRemoveOnUninstall">
<RegistryValue Type="string" Name="Key1" Value="1rp1users" KeyPath="yes"/>
<RegistryValue Type="string" Name="Key2" Value="http://windowsbackup/m1" />
</RegistryKey>
</Component>
....
<ComponentRef Id="RegistryEntries" />
问题: 到目前为止,自从我们使用补丁以来,我们没有遇到任何升级问题。从下一个版本开始,我们希望进行重大升级,但最大的挑战是:在重大升级期间,旧产品将被卸载。根据 wix 片段,“Broker”注册表元素的操作元素是 “CreateAndRemoveOnUninstall”,因此整个“Broker”节点以及“Key3”子项都会被删除。
如果我将操作更新为“创建”,问题将通过新安装得到解决,但由于 msi 已经投入生产,如何防止它在现有产品主要升级过程中删除注册表?
最佳答案
您需要实现 Remember Property图案。这将导致新的 MSI 在主要升级删除旧版本之前检索数据,然后在最后重新应用它。
关于wix - 如何防止注册表删除作为已安装的 MSI 卸载的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744315/