如何根据Windows操作系统位数动态设置RegistrySearch元素的Win64属性?
动态设置RegistrySearch的Win64属性(基于系统位数)
好问题!在WiX Burn中要根据操作系统位数自动切换RegistrySearch的Win64属性值,确实有两种实用的方案,完美适配你需要检测VSTO Runtime的场景:
方案1:用Condition区分两个RegistrySearch元素
这是最灵活的运行时判断方案,适合单安装包同时支持32位和64位系统的场景。核心思路是创建两个RegistrySearch,分别对应32位和64位系统的注册表路径,通过Condition绑定系统位数变量VersionNT64来控制执行哪个搜索。
VersionNT64是Burn的内置变量:
- 64位系统中,该变量存在(值为系统版本号,比如601代表Windows 7)
- 32位系统中,该变量不存在
具体代码示例:
<!-- 64位系统:搜索WOW6432Node下的VSTO注册表路径 --> <util:RegistrySearch Id="VSTORuntime_x64" Root="HKLM" Key="SOFTWARE\WOW6432Node\Microsoft\VSTO Runtime Setup\v4R\" Value="VSTORFeature_CLR40" Variable="VSTORFeature" Win64="yes" Condition="VersionNT64" /> <!-- 32位系统:直接搜索SOFTWARE下的VSTO注册表路径 --> <util:RegistrySearch Id="VSTORuntime_x86" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="VSTORFeature_CLR40" Variable="VSTORFeature" Win64="no" Condition="NOT VersionNT64" />
Burn会在运行时自动判断系统位数,执行符合条件的RegistrySearch,最终VSTORFeature变量会得到正确的注册表值。
方案2:编译时用预处理器变量指定Win64值
如果你是分平台编译安装包(比如单独编译32位和64位版本),可以用WiX的预处理器变量$(var.Platform)来静态设置Win64属性:
<util:RegistrySearch Id="VSTORuntime" Root="HKLM" Key="$(var.Platform) = x64 ? 'SOFTWARE\WOW6432Node\Microsoft\VSTO Runtime Setup\v4R\' : 'SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\'" Value="VSTORFeature_CLR40" Variable="VSTORFeature" Win64="$(var.Platform) = x64 ? 'yes' : 'no'" />
编译时只要指定Platform=x64或x86,WiX预处理器会自动替换对应的路径和Win64值。不过这种方案灵活性不如第一种,适合不需要单包跨平台的场景。
补充说明
注意Win64="yes"的作用:因为Burn默认是32位进程,当在64位系统中设置Win64="yes"时,它会主动访问64位系统的32位注册表分支(也就是WOW6432Node),正好匹配VSTO Runtime的安装路径;而32位系统中Win64="no"则直接访问常规注册表路径,完全符合你的需求。
内容的提问来源于stack exchange,提问作者yanpengl
相关产品推荐
相关产品推荐

