RegistryValue在进行Wix小升级后被清除

本文关键字:清除 Wix RegistryValue | 更新日期: 2023-09-27 18:05:27

我目前正在维护一个软件,该软件包含大量用户定义的注册表项。我正在尝试制作一个WIX安装程序,使这些注册表项保持最少的接触可维护性的数量。我决定让注册表项中的每个值都成为它自己的组件,以允许我使用WIX的NeverOverwrite='yes'功能。我假设它的存在会允许小的升级(例如REINSTALL=ALL REINSTALLMODE=vomus(来创建价值,如果它存在的话,就别管它了。然而,在我的现实世界示例中似乎并没有发生这种情况(功能上没有条件(。文件告诉我我应该很好。以下是一些示例:

<Product Id="UNIQUE_KEY" Name="Spotbox Manager" Language="1033" Version="1.0.1.0"    Manufacturer="Company"  UpgradeCode="MY_UPGRADE_KEY">
<Package  Platform="x64" Id="*" InstallerVersion="200" Compressed="yes"    InstallScope="perMachine" InstallPrivileges="elevated" />
<Upgrade Id="MY_UPGRADE_KEY">
  <UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
    Minimum='1.0.1' IncludeMinimum='yes'
    Maximum='1.0.1' IncludeMaximum='yes' />
  <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
    Minimum='1.0.1' IncludeMinimum='no' />
</Upgrade>

这是注册表项的实际片段

<Component Id="cmp171812fcc51a4b91ad386fa8c27c9b89" Directory="TARGETDIR" Guid="COMPONENT_GUID"  Win64='yes' NeverOverwrite='yes'>
  <RegistryKey Key="SOFTWARE'Company" Root="HKLM">
    <RegistryValue Name="Value" Value="1100797834" Type="integer" KeyPath='yes'/>
  </RegistryKey>
</Component>
<Component Id="cmp211639bff9694f029028a22cb0bb9687" Directory="TARGETDIR" Guid="NEW COMPONENT GUID"  Win64='yes' NeverOverwrite='yes'>
  <RegistryKey Key="SOFTWARE'Company" Root="HKLM">
    <RegistryValue Name="Country Code" Value="1" Type="integer" KeyPath='yes' />
  </RegistryKey>
</Component> ...

请注意:两个值的密钥都是相同的。当我尝试更改它时,这似乎仍然会破坏用户的值。

RegistryValue在进行Wix小升级后被清除

首先,在同一注册表项下有多个值,并将它们用作单独的键路径是没有问题的。术语"keypath"与注册表术语无关,在注册表的情况下,它实际上必须标识一个值,而不是键。

其次,您的评论提到,产品卸载不会在小升级期间发生。这在产品级别上是正确的,但在组件级别上则不正确。

您应该检查您是否在产品的旧版本和新版本之间更改了行为不端组件的GUID或密钥路径——如果您更改了,则显然违反了小升级(组件删除(的规则。然而,请继续阅读,即使您的GUID是稳定的,我也有一个更通用的解释。

次要更新是重新安装。我在想象以下事件的顺序。

  1. (CostFinalize(Windows安装程序检查是否已经安装了与每个密钥路径相同的组件(用户没有重写或删除(,因此不必安装;根据被启用的NeverOverwrite(
  2. (InstallExecute(Windows Installer从旧的MSI中卸载该组件,因为该组件将被新的MSI替换(由次要更新规则保证(;根据在旧包中被禁用的CCD_ 2
  3. (InstallExecute(Windows安装程序会记住步骤1中的检查,不关心使用相同的密钥路径安装不同的组件

您至少有这些选项可供更正,请选择一个。

  • 进行重大升级。这几乎总是更容易、更好的选择
  • 除了启用NeverOverwrite之外,还启用Permanent,假设您可以在所有版本中这样做;基本上,你还没有发布任何明确的消息。大多数人都会保持这些属性的同步,所以为什么不随大流,减少问题呢
  • 扰乱行动顺序。示例:

    <RemoveExistingProducts After="InstallValidate"/>

最后一个选项会使您的升级速度变慢,但如果您真的想要进行小升级并在没有Permanent的情况下利用NeverOverwrite,那么这可能是必要的。

我发现这个问题——这是一个用户错误——我在注册表中有太多的值,以至于我没有注意到另一个类似但没有组件元素的部分(旧配置(。我把它取下来后,一切都如预期的那样。谢谢你们的帮助。