如何通过NSIS脚本检测.NET Core 3.1 Windows桌面运行时是否已安装
NSIS脚本检测.NET Core 3.1 Windows桌面运行时方案
.NET Core系列运行时的检测逻辑和.NET Framework差异较大,你可以通过注册表检测、命令行校验两种方式实现,推荐两种组合使用提高检测准确率。
方法1:注册表检测(推荐,无环境依赖)
微软会在安装.NET桌面运行时后写入固定注册表项,NSIS直接读取对应项判断即可,支持区分x86/x64架构:
Var DotNetCore31Exist Section "CheckDotNetCore31" StrCpy $DotNetCore31Exist 0 ; 64位系统检测64位运行时 ${If} ${RunningX64} ; 优先读桌面运行时专属注册表项 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows Desktop Runtime\v3.1" "Version" ${If} ${StrStartsWith} $0 "3.1." StrCpy $DotNetCore31Exist 1 ${EndIf} ; 兜底读dotnet通用共享运行时注册表 ${If} $DotNetCore31Exist == 0 ReadRegStr $0 HKLM "SOFTWARE\dotnet\Setup\InstalledVersions\x64\shared\Microsoft.WindowsDesktop.App" "3.1.0" ${If} $0 != "" StrCpy $DotNetCore31Exist 1 ${EndIf} ${EndIf} ${Else} ; 32位系统检测32位运行时 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows Desktop Runtime\v3.1" "Version" ${If} ${StrStartsWith} $0 "3.1." StrCpy $DotNetCore31Exist 1 ${EndIf} ${If} $DotNetCore31Exist == 0 ReadRegStr $0 HKLM "SOFTWARE\dotnet\Setup\InstalledVersions\x86\shared\Microsoft.WindowsDesktop.App" "3.1.0" ${If} $0 != "" StrCpy $DotNetCore31Exist 1 ${EndIf} ${EndIf} ${EndIf} ; 未检测到运行时则执行静默安装 ${If} $DotNetCore31Exist == 0 ExecWait "$TEMP\windowsdesktop-runtime-3.1.32-win-x64.exe /install /quiet /norestart" $0 ; 若返回3010则说明需要重启,可自行添加重启提示逻辑 ${EndIf} SectionEnd
注意:以上代码用到的
${StrStartsWith}、${RunningX64}需要你引入NSIS的LogicLib、x64.nsh头文件。
方法2:命令行校验(兜底补充)
如果目标设备环境变量配置正常,可以调用dotnet命令查询已安装运行时列表,过滤匹配3.1版本的桌面运行时:
nsExec::ExecToStack 'dotnet --list-runtimes' Pop $0 ; 取返回码 Pop $1 ; 取输出内容 ${If} $0 == 0 ${If} ${StrContains} $1 "Microsoft.WindowsDesktop.App 3.1." StrCpy $DotNetCore31Exist 1 ${EndIf} ${EndIf}
注意事项
- 按照你打包的应用架构匹配检测对应的运行时,32位应用只需要检测32位运行时即可
- 不用严格匹配具体小版本号,所有3.1.x版本的桌面运行时都向下兼容同大版本的.NET Core 3.1应用
- 运行时离线安装包可以提前打包进你的安装包资源里,检测失败时直接调用即可,不需要用户自行下载
内容的提问来源于stack exchange,提问作者Nlr
相关产品推荐
相关产品推荐

