如何使用Wix 3.11实现.NET 5运行环境检测
Wix 3.11 实现.NET 5运行时检测的方案
你之前使用的NETFRAMEWORK45属性仅适配传统.NET Framework 4.x及更早版本的检测。.NET 5及后续版本与传统.NET Framework完全独立,不会在原有的.NET Framework注册表路径写入任何版本信息,因此原有检测逻辑对.NET 5无效是正常现象。
核心检测逻辑
.NET 5及以上版本的桌面运行时(适配Windows桌面应用的运行时类型)安装完成后,会在系统注册表写入版本标识:
- 64位运行时版本存储路径:
HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App,路径下的Version键值对应已安装的运行时版本号 - 32位运行时版本存储路径:将上述路径中的
x64替换为x86即可
如果需要检测ASP.NET Core运行时,只需要把路径末尾的Microsoft.WindowsDesktop.App替换为Microsoft.AspNetCore.App,路径结构完全一致
完整实现代码
方式1:自定义注册表搜索(适配所有Wix 3.11版本)
首先自定义属性读取注册表中的运行时版本信息:
<!-- 示例为检测64位.NET Desktop Runtime,32位安装包请调整路径和Win64参数 --> <Property Id="DOTNET_DESKTOP_RUNTIME_VERSION"> <RegistrySearch Id="SearchDotNetDesktopRuntime" Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App" Name="Version" Type="raw" Win64="yes" /> </Property>
之后添加安装条件,判断版本是否满足要求:
<Condition Message="This application requires .NET Desktop Runtime 5.0 or later. Please install the required runtime then run this installer again."> <![CDATA[Installed OR (DOTNET_DESKTOP_RUNTIME_VERSION >= "5.0.0")]]> </Condition>
方式2:使用内置扩展属性(适配Wix 3.11.2及以上版本)
如果项目已经引用了WixNetFxExtension扩展,可以直接使用扩展内置的预定义属性快速检测,不需要手写注册表搜索逻辑:
<PropertyRef Id="DOTNETCORE5" /> <Condition Message="This application requires .NET Desktop Runtime 5.0 or later. Please install the required runtime then run this installer again."> <![CDATA[Installed OR DOTNETCORE5]]> </Condition>
注意事项
- Wix的内置版本对比逻辑可以正确识别语义化版本号格式,直接使用
>=运算符即可准确判断版本高低,不需要额外做字符串处理 - 如果是32位安装包,在64位系统上读取64位运行时信息时,必须保留
Win64="yes"参数,否则系统会自动重定向注册表路径,无法读取到真实的64位运行时版本 - 如果需要检测更高版本的.NET运行时,只需要将对比的版本号或预定义属性名替换为对应版本即可,比如要求.NET 6时,将属性名改为
DOTNETCORE6 - 条件中的
Installed判断是为了避免在应用已经安装完成、后续修复或卸载流程中重复触发运行时校验,和原有检测逻辑的设计保持一致
内容的提问来源于stack exchange,提问作者Atif Waqar
相关产品推荐
相关产品推荐

