我目前正在维护一个软件,其中包含大量用户定义的注册表项。 我正在尝试制作一个 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> ...
请注意:两个值的 key 相同 当我尝试更改它时,这似乎仍然会破坏用户的值(value)。
最佳答案
首先,在同一个注册表项下拥有多个值并将它们用作单独的键路径没有问题。术语“键路径”与注册表术语无关,在注册表的情况下,它实际上必须标识一个值而不是一个键。
其次,您的评论提到在次要升级期间不会发生产品卸载。这在产品级别是正确的,但在组件级别不是。
您应该检查您是否没有在产品的新旧版本之间更改行为不当组件的 GUID 或 key 路径 - 如果您这样做,您显然违反了次要升级(组件删除)的规则。但是,即使您的 GUID 是稳定的,请继续阅读,我有一个更通用的解释给您。
次要更新是重新安装。我正在想象以下事件顺序。
- (CostFinalize) Windows Installer 检查是否已安装与 key 路径相同的组件(未被用户重写或删除),因此不必安装;根据
NeverOverwrite
正在启用)。 - (InstallExecute) Windows Installer 从旧的 MSI 卸载组件,因为组件将被新的 MSI 替换(由次要更新规则保证);根据
Permanent
在旧包中被禁用。 - (InstallExecute) Windows Installer 会记住第 1 步中的检查,并且不关心安装具有相同 key 路径的不同组件。
您至少有这些修正选项,请选择一个。
- 进行重大升级。这几乎总是更容易和更好的选择。
- 启用
Permanent
除了NeverOverwrite
,假设您可以在所有版本中这样做;基本上,您还没有发布任何确定的内容。大多数人都保持这些属性同步,所以为什么不随大流并减少问题呢。 打乱 Action 顺序。示例:
<RemoveExistingProducts After="InstallValidate"/>
最后一个选项会使你的升级变慢,但如果你真的想要小升级并利用 NeverOverwrite
,这可能是必要的没有Permanent
.
关于c# - RegistryValue 在进行 Wix 次要升级后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578883/