Inno Setup打包脚本中如何检测系统是否已安装.NET 5.0
Inno Setup 打包 .NET 5.0 程序时实现运行时按需安装
实现原理
.NET 5 属于 .NET Core 迭代产品线,和传统 .NET Framework 的注册表检测路径完全不同。x64 版本的 .NET 5.0 桌面运行时安装后,会在注册表 HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App 路径下写入Version值记录已安装版本号,只要该值大于等于你依赖的最低版本,即可判定运行时已安装,无需重复执行安装包。
修改后的完整脚本
你只需要在原有脚本基础上增加自定义检测函数,给运行时的文件释放、安装执行步骤加上检测触发条件即可,不需要依赖第三方插件:
#define AppName "LowPoly Games Launcher" #define AppEXEName "LPG Launcher.exe" // 抽离运行时相关配置,后续维护更方便 #define DotNetMinVersion "5.0.17" #define DotNetInstallerName "windowsdesktop-runtime-5.0.17-win-x64.exe" [Setup] AppName={#AppName} // 补充64位安装配置,避免注册表重定向导致检测失效 ArchitecturesInstallIn64BitMode=x64 [Files] Source: "..\bin\Release\net5.0-windows\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs; // 仅未检测到对应运行时时才释放安装包,减少无用文件写入 Source: "Resources\{#DotNetInstallerName}"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall; Check: not IsDotNet5DesktopInstalled [Run] Filename: "{app}\{#AppEXEName}"; Description: "{cm:LaunchProgram, {#StringChange(AppName, '&', '&&')}}"; Flags: nowait postinstall // 仅未检测到运行时时执行安装,修正原提示里的".NET Framework"错误表述,优化安装参数避免强制重启 Filename: "{app}\{#DotNetInstallerName}"; Parameters: "/install /q /norestart"; Flags: waituntilterminated; StatusMsg: "正在安装 Microsoft .NET 5.0 桌面运行时,请稍候..."; Check: not IsDotNet5DesktopInstalled [Code] function IsDotNet5DesktopInstalled: Boolean; var InstalledVer: string; begin Result := False; // 读取64位注册表分支的.NET版本记录 if RegQueryStringValue(HKLM, 'SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App', 'Version', InstalledVer) then begin // 已安装版本大于等于要求的最低版本即判定为符合要求 Result := CompareStr(InstalledVer, '{#DotNetMinVersion}') >= 0; end; end;
补充说明
- 如果你后续需要打包32位版本的程序,只需要把注册表路径里的
x64替换为x86,同时替换对应架构的.NET运行时安装包即可。 - 原脚本里的安装参数
/q/passive存在冲突:/q为完全静默无界面,/passive为仅显示进度条无需用户交互,修改为/install /q /norestart可以实现完全静默安装,同时避免运行时安装完成后强制重启用户设备。 - 版本对比逻辑兼容更高的5.x补丁版本:如果用户系统已经安装了5.0.17以上的.NET 5桌面运行时,会自动跳过安装步骤,不会出现强制降级安装的问题。
- 该逻辑完全基于Inno Setup原生Pascal脚本实现,兼容Inno Setup 6.0及以上版本,不需要引入额外依赖。
内容的提问来源于stack exchange,提问作者Istalri Skolir
相关产品推荐
相关产品推荐

