2013-03-22 75 views
4

我目前正在维护一个具有用户定义的注册表项加载的软件。 我试图做一个WIX安装程序,保持这些注册表键与至少 数量的可维护性。我决定让每个值都在一个注册表键中,它是自己的组件,允许我使用WIX的NeverOverwrite ='yes'功能。我认为这样做会允许次要升级(例如REINSTALL = ALL REINSTALLMODE = vomus),如果它存在,则创建该值,否则将其保留。但是,这似乎并没有发生在我的真实世界的例子(功能没有条件)。文件告诉我我应该很好。下面是几样:注册表值在执行Wix次要升级后消除

<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> ... 

请注意:关键是这两个值这似乎仍然吹走用户的价值时相同我尝试改变它。

+0

您究竟如何设置GUID?并且,尝试在NeverOverwrite旁边启用永久。 – 2013-03-22 20:47:06

+0

我收到来自Resharpers nguid snippet命令的guid。我不明白Permanant会如何处理。我是否将它与NeverOverwrite一起使用或者替代? – 2013-03-22 21:32:15

+0

有。如果我知道为什么(在你的情况下),这将是一个答案,而不是一个评论。 – 2013-03-22 21:34:12

回答

1

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

其次,您的意见提到产品卸载不会在次要升级过程中发生。这在产品级别上是正确的,但不是在组件级别上。

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

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

  1. (CostFinalize)Windows安装检查该相同的部件每的keyPath已经安装(未重写或由用户删除的),因此不必安装;根据NeverOverwrite被启用)。
  2. (InstallExecute)Windows安装程序将卸载旧MSI中的组件,因为该组件将由新的MSI(由次要更新规则保证)替换;根据旧包装中的Permanent被禁用。
  3. (InstallExecute)Windows安装程序会记住步骤1中的检查,并且不会考虑使用相同的keypath安装不同的组件。

您至少有这些选项进行更正,选择一个。

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

    <RemoveExistingProducts After="InstallValidate"/>

这最后的选择会让你的升级速度较慢,但​​是这可能是必要的,如果你真的想轻微的升级和利用NeverOverwritePermanent

+0

我将在明天尝试运行processmonitor并查看是否有任何删除操作,然后添加密钥或者只是将其覆盖。我也会保留永久的。我很幸运,它还没有被部署到生产中,所以我有一段时间以我想要的方式获得它。 – 2013-03-25 08:30:06

0

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