RegistryValue在执行Wix次要升级后被清除

时间:2013-03-22 19:59:08

标签: c# installer wix

我目前正在维护一个拥有大量用户定义的注册表项的软件。 我正在尝试创建一个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> ...

请注意:两个值的键是相同的当我尝试更改它时,这似乎仍然会消除用户的值。

2 个答案:

答案 0 :(得分:1)

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

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

您应检查是否未更改产品的旧版本和新版本之间行为不当的组件的GUID或密钥路径 - 如果您这样做,则明显违反了次要升级(组件删除)的规则。但是,即使您的GUID稳定,请继续阅读,我有一个更通用的解释。

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

  1. (CostFinalize)Windows Installer检查是否已安装与每个密钥路径相同的组件(未由用户重写或删除),因此不必安装;根据{{​​1}}启用)。
  2. (InstallExecute)Windows Installer从旧的MSI卸载组件,因为该组件将被新的MSI替换(由次要更新规则保证);根据旧包中的NeverOverwrite被禁用。
  3. (InstallExecute)Windows Installer会记住步骤1中的检查,而不关心使用相同的密钥路径安装不同的组件。
  4. 你至少有这些修正选项,选择一个。

    • 进行重大升级。这几乎总是更容易和更好的选择。
    • 除了Permanent之外,启用Permanent,假设您可以在所有版本中执行此操作;基本上,你还没有发布任何确定的东西。大多数人都保持这些属性同步,所以为什么不跟随人群并减少问题。
    • 与行动顺序混淆。例如:

      NeverOverwrite

    这最后一个选项会让您的升级速度变慢,但如果您真的需要进行小幅升级并在没有<RemoveExistingProducts After="InstallValidate"/>的情况下利用NeverOverwrite,那么这可能是必要的。

答案 1 :(得分:0)

我发现问题是用户错误我在注册表中有这么多的值,我没有注意到另一个类似但没有组件元素的部分(旧配置)。删除后,一切按预期工作。谢谢你的帮助。