WIX Installer如何无自定义操作查询注册表检测.NET运行时版本
WIX 无自定义操作实现.NET 6 Windows桌面运行时版本校验
核心校验规则依据
- 前置要求:系统需安装主版本号为6、版本号
>=6.0.4的.NET Windows桌面运行时,6.0.5、6.0.6等后续补丁版本均视为符合要求 - 注册表存储逻辑:.NET Windows桌面运行时安装时,会在
HKLM\SOFTWARE\WOW6432Node\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App路径下,为每个已安装的有效版本创建对应版本号命名的DWORD值;升级安装时会自动删除旧版本对应的注册表项,不存在残留失效项的问题 - 旧版校验逻辑读取
sharedf路径下的Version值仅适配单版本安装场景,升级/多版本共存场景会出现判断错误,不建议继续使用
具体实现步骤
全程使用WIX原生功能,无需编写任何CustomAction。
1. 配置注册表搜索规则
在WIX项目的Product节点下,添加内置的注册表搜索配置,直接枚举目标路径下的所有版本项并做版本过滤:
<Property Id="DOTNET_DESKTOP_RUNTIME_OK"> <RegistrySearch Id="SearchX64DesktopRuntimeV6" Root="HKLM" Key="SOFTWARE\WOW6432Node\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App" Type="raw" Win64="no"> <!-- 过滤规则:版本 >=6.0.4 且 <7.0.0(锁定大版本6) --> <RegistrySearchFilter Type="version" Comparison="ge" Value="6.0.4" /> <RegistrySearchFilter Type="version" Comparison="lt" Value="7.0.0" /> </RegistrySearch> </Property>
配置说明:
Type="raw"会枚举指定注册表键下的所有值名,配合RegistrySearchFilter可直接对值名做版本比较,无需手动枚举逐个判断Win64="no"指定搜索32位注册表视图,对应WOW6432Node节点路径,WIX会自动定位到正确的注册表位置,不会出现视图错位问题- 只要路径下存在任意一个符合版本规则的DWORD值,
DOTNET_DESKTOP_RUNTIME_OK属性就会被自动赋值,代表运行时环境符合要求
如果需要同时兼容x86版本的运行时,追加一条路径指向x86节点的注册表搜索即可,最终条件判断两个属性任意一个非空就判定通过。
2. 配置安装启动条件
在安装序列中添加启动条件,未满足运行时要求时直接阻断安装流程:
<Condition Message="安装前置依赖缺失:请先安装版本号不低于6.0.4的.NET 6 Windows桌面运行时,再启动本安装程序。"> <![CDATA[Installed OR DOTNET_DESKTOP_RUNTIME_OK]]> </Condition>
条件说明:
Installed是WIX内置属性,代表当前产品已经完成安装,在修改、卸载等维护场景下会跳过运行时校验,避免阻断已安装产品的正常操作- 未安装状态下,只有搜索到符合版本要求的运行时,条件才会判定为真,安装流程正常继续
兼容性说明
- 上述配置兼容WIX 3.11+、WIX 4.x所有稳定版本
- 无需额外处理版本升级场景:.NET运行时安装程序会自动清理旧版本的无效注册表项,搜索匹配到的版本均为系统中真实存在的有效运行时
- 整个逻辑完全基于WIX原生的注册表搜索、条件判断能力实现,无自定义脚本或外部调用,符合MSI安装包的最佳实践要求
内容的提问来源于stack exchange,提问作者MG_
相关产品推荐
相关产品推荐

