加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – RegistryValue在执行Wix次要升级后被擦除

发布时间:2020-12-15 21:49:17 所属栏目:百科 来源:网络整理
导读:我目前正在维护一个具有大量用户定义的注册表项的软件. 我正在尝试创建一个WIX安装程序,使这些注册表项保持最少 可维护性.我决定在注册表项中使用它自己的组件中的每个值,以允许我使用WIX的NeverOverwrite =’yes’功能.我认为这样的存在将允许小的升级(例如
我目前正在维护一个具有大量用户定义的注册表项的软件.
我正在尝试创建一个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="SOFTWARECompany" 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="SOFTWARECompany" Root="HKLM">
    <RegistryValue Name="Country Code" Value="1" Type="integer" KeyPath='yes' />
  </RegistryKey>
</Component> ...

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

解决方法

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

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

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

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

>(CostFinalize)Windows Installer检查是否已安装与每个密钥路径相同的组件(未由用户重写或删除),因此不必安装;根据NeverOverwrite启用).
>(InstallExecute)Windows Installer从旧的MSI卸载组件,因为组件将被新的MSI替换(由次要更新规则保证);根据旧包裹中的永久残疾人.
>(InstallExecute)Windows Installer会记住步骤1中的检查,而不关心使用相同的密钥路径安装不同的组件.

你至少有这些修正选项,选择一个.

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

< RemoveExistingProducts After =“InstallValidate”/>

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读