【问题标题】:RegistryValue Wiped Out After doing a Wix Minor Upgrade进行 Wix 次要升级后,RegistryValue 被清除
【发布时间】:2013-03-12 19:31:51
【问题描述】:

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

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

【问题讨论】:

  • 您究竟是如何设置 GUID 的?并且,尝试在 NeverOverwrite 旁边启用永久。
  • 我正在接收来自 Resharpers nguid sn-p 命令的 guid。我看不出永久人会有什么影响。我是用 NeverOverwrite 还是代替它?
  • 与。如果我知道原因(在你的情况下),那将是一个答案,而不是评论。
  • 似乎对它没有任何影响。我想知道是否有任何设置。如果它不适用于特定的拱门或类似的东西。
  • 我想我成功了。是的,Permanent 应该这样做,但也需要在 old MSI 上进行设置。原因是该组件通过旧的 MSI 进行卸载。这导致 KeyPath 消失。这会触发新 MSI 的安装。

标签: c# installation wix


【解决方案1】:

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

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

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

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

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

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

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

    &lt;RemoveExistingProducts After="InstallValidate"/&gt;

最后一个选项会使您的升级速度变慢,但如果您真的想要小幅升级并利用 NeverOverwrite 而不使用 Permanent,这可能是必要的。

【讨论】:

  • 我明天将尝试运行 processmonitor,看看是否有任何删除然后添加密钥或者是否只是覆盖它。我也将永久保留在上面。我很幸运,它还没有被部署到生产环境中,所以我有时间按照我想要的方式得到它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 2018-04-29
    • 2015-04-06
    • 2017-02-27
    • 2017-01-24
    • 1970-01-01
    • 2018-10-20
    • 2015-04-12
    相关资源
    最近更新 更多