Windows 如何在WiX中有条件地设置属性或注册表值?

Windows 如何在WiX中有条件地设置属性或注册表值?,windows,installation,wix,wix3,Windows,Installation,Wix,Wix3,我有一个Wix工具集项目,其中包含如下组件,其中MYLANGUAGE是一个公共属性,可以在安装产品时进行设置: <Component Id='language_reg' Guid='*' Permanent='yes'> <Condition>MYLANGUAGE</Condition> <RegistryValue Type='string' Root='HKLM' Key='Software\MyCompa

我有一个Wix工具集项目,其中包含如下组件,其中MYLANGUAGE是一个公共属性,可以在安装产品时进行设置:

      <Component Id='language_reg' Guid='*' Permanent='yes'>
        <Condition>MYLANGUAGE</Condition>
        <RegistryValue Type='string' Root='HKLM' Key='Software\MyCompany\MyProduct' Name='language'
        Value='[MYLANGUAGE]' KeyPath='yes' />
      </Component>

我的语言
现在我正在从32位64位升级这个软件包。由于WOW64,我的软件现有32位版本的上述密钥存储在HKLM\software\WOW6432Node\MyCompany\MyProduct下

升级到软件包的新64位版本后,我希望在HKLM\Software\MyCompany\MyProduct密钥中也设置该值。该值应设置如下:

  • 如果在安装时设置了公共属性MYLANGUAGE,则该属性的值应存储在HKLM\Software\MyCompany\MyProduct language中
  • 如果未设置公共属性MYLANGUAGE,并且HKLM\Software\MyCompany\MyProduct密钥不存在,并且设置了HKLM\Software\WOW6432Node\MyCompany\MyProduct语言值,则我希望将该值从HKLM\Software\WOW6432Node\MyCompany\MyProduct语言复制到HKLM\Software\MyCompany\MyProduct语言

如何使用WIX工具集实现这一点?

这是WIX记忆属性模式,但有点复杂

使用MyLanguage的默认值定义属性MyLanguageDefault

使用AppSearch/Reglocator(属性/RegistrySearch)将64位值读入64位临时属性

使用AppSearch/Reglocator(属性/RegistrySearch)将32位值读入32位临时属性。 如果MYLANGUAGE为null(可能是在命令行中传递的),并且64位temp属性不为null,则使用SetProperty自定义操作将64位temp属性分配给MYLANGUAGE

如果MYLANGUAGE为null(可能是在命令行中传递的),并且32位temp属性不为null,则使用SetProperty自定义操作将32位temp属性分配给MYLANGUAGE

如果MYLANGUAGE为null,则使用SetProperty自定义操作将MyLanguageDefault分配给MyLanguageDefault(在命令行中未传递任何内容,在32位或64位中未找到任何内容,然后使用默认值)

如果您希望他们能够编辑我的语言,请在对话框中显示我的语言

在组件/注册表值中使用MyLanguage将值写入64位注册表。组件需要将Win64属性设置为yes


请注意,还需要使用Secure=“yes”属性将MYLANGUAGE标记为安全的自定义公共属性。

就在我脑海中,您的WiX代码看起来是正确的。你有没有在没有升级的独立MSI中尝试过?我怀疑的一点是组件本身存在升级问题。您没有说您是在进行小升级还是大升级,但在小升级中需要遵循某些组件规则。