Inno Setup 检测已安装的.NET Framework 版本支持检测.NET Framework 4.5 4.6 4.7 4.8

该博客介绍了如何使用InnoSetup脚本来检测计算机上是否已安装.NET Framework 4.8,如果未安装,则提供下载和安装的流程。脚本包含了针对不同.NET Framework版本的检查逻辑,并且在安装过程中处理可能的重启需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Inno Setup 检测已安装的.NET Framework 版本

;.NET Framework 安装文件
#define DotNetSetupFile "ndp48-web.exe"
; 上述消息放置到脚本的顶部

[Code]
const CDotNetSetupFile = '{#DotNetSetupFile}';
var VNeedRestart: boolean;
function IsDotNetDetected(version: string; service: cardinal): boolean;
// Indicates whether the specified version and service pack of the .NET Framework is installed.
//
// version -- Specify one of these strings for the required .NET Framework version:
//    'v1.1'          .NET Framework 1.1
//    'v2.0'          .NET Framework 2.0
//    'v3.0'          .NET Framework 3.0
//    'v3.5'          .NET Framework 3.5
//    'v4\Client'     .NET Framework 4.0 Client Profile
//    'v4\Full'       .NET Framework 4.0 Full Installation
//    'v4.5'          .NET Framework 4.5
//    'v4.5.1'        .NET Framework 4.5.1
//    'v4.5.2'        .NET Framework 4.5.2
//    'v4.6'          .NET Framework 4.6
//    'v4.6.1'        .NET Framework 4.6.1
//    'v4.6.2'        .NET Framework 4.6.2
//    'v4.7'          .NET Framework 4.7
//    'v4.7.1'        .NET Framework 4.7.1
//    'v4.7.2'        .NET Framework 4.7.2
//    'v4.8'          .NET Framework 4.8
//
// service -- Specify any non-negative integer for the required service pack level:
//    0               No service packs required
//    1, 2, etc.      Service pack 1, 2, etc. required
var
    key, versionKey: string;
    install, release, serviceCount, versionRelease: cardinal;
    success: boolean;
begin
    versionKey := version;
    versionRelease := 0;

    // .NET 1.1 and 2.0 embed release number in version key
    if version = 'v1.1' then begin
        versionKey := 'v1.1.4322';
    end
    else if version = 'v2.0' then begin
        versionKey := 'v2.0.50727';
    end

    // .NET 4.5 and newer install as update to .NET 4.0 Full
    else if Pos('v4.', version) = 1 then begin
        versionKey := 'v4\Full';
        case version of
        // from url https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed
          'v4.5':   versionRelease := 378389;
          'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
          'v4.5.2': versionRelease := 379893;
          'v4.6':   versionRelease := 393295; // 393297 on Windows 8.1 and older
          'v4.6.1': versionRelease := 394254; // 394271 on Windows 8.1 and older
          'v4.6.2': versionRelease := 394802; // 394806 on Windows 8.1 and older
          'v4.7':   versionRelease := 460798; // 460805 On all other Windows operating systems (including other Windows 10 operating systems)
          'v4.7.1': versionRelease := 461308; // 461310 On all other Windows operating systems (including other Windows 10 operating systems)
          'v4.7.2': versionRelease := 461808; // 461814 On all Windows operating systems other than Windows 10 April 2018 Update and Windows Server, version 1803
          'v4.8'  : versionRelease := 528040; // On Windows 10 May 2019 Update and Windows 10 November 2019 Update: 528040; On Windows 10 May 2020 Update and Windows 10 October 2020 Update: 528372; On all other Windows operating systems (including other Windows 10 operating systems): 528049
        end;
    end;

    // installation key group for all .NET versions
    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;

    // .NET 3.0 uses value InstallSuccess in subkey Setup
    if Pos('v3.0', version) = 1 then begin
        success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
    end else begin
        success := RegQueryDWordValue(HKLM, key, 'Install', install);
    end;

    // .NET 4.0 and newer use value Servicing instead of SP
    if Pos('v4', version) = 1 then begin
        success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
    end else begin
        success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
    end;

    // .NET 4.5 and newer use additional value Release
    if versionRelease > 0 then begin
        success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
        success := success and (release >= versionRelease);
    end;

    result := success and (install = 1) and (serviceCount >= service);
end;

function InitializeSetup(): Boolean;
var IEPath, NetV2DownUrl, DotNetPath:string;
var ResultCode:Integer;
begin
    VNeedRestart := false;

    if not IsDotNetDetected('v4.8', 0) then begin
      
      if MsgBox('系统缺少程序运行组件.Net Framework 4.8,是否立刻下载并安装?', mbConfirmation, MB_YESNO) = idYes then begin
          // 临时解压安装文件
          ExtractTemporaryFile(CDotNetSetupFile);
          DotNetPath := ExpandConstant('{tmp}\'+CDotNetSetupFile);
          // 运行
          if Exec(DotNetPath,'/norestart /passive /showfinalerror','',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode) then begin
              if ResultCode = 0 then begin
                  result := true;
              end else if (ResultCode = 1641) or (ResultCode = 3010) then begin
                  // 需要重新启动才能完成安装。 此消息指示安装成功。
                  VNeedRestart := true;
                  result := true;
              end else begin
                  result := false;
              end
          end else begin
              MsgBox('运行.Net Framework 4.8安装程序失败!',mbError,MB_OK);
              result := false;
          end
      end
    end else begin
        result := true;
    end
end;

function NeedRestart(): Boolean;
begin
  result := VNeedRestart;
end;

安装程序可以从微软官方下载:
https://dotnet.microsoft.com/download/dotnet-framework

参考:

确定已安装的 .NET Framework 版本 | Microsoft Docs
https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

Inno Setup 判断.NET是否安装_tcmtang的博客-CSDN博客 https://blog.csdn.net/tcmtang/article/details/49932205

Inno Setup 检测已安装的.NET Framework 版本 - 知乎
https://zhuanlan.zhihu.com/p/51658788

<think>好的,我需要帮助用户查找如何检测当前系统中已安装.NET Framework的具体版本。首先,用户的问题集中在检测安装版本的方法上,我需要结合提供的引用信息来整理出几种有效的方法。 根据引用[1],用户可以通过访问安装目录来查看版本。通常路径是C:\Windows\Microsoft.NET\Framework,那里会有各个版本的子目录,比如v4.0.30319对应.NET 4.0。这方法直接,但可能需要用户手动检查,适合对系统目录比较熟悉的用户。 接下来引用[2]和[3]提到了使用Inno Setup脚本中的IsDotNetDetected函数来检测版本,特别是4.5及更高版本。这对于开发者在安装程序中自动检测环境很有帮助。需要解释一下函数的使用方法,比如如何指定版本号和服务包级别。 引用[4]提到不安装框架运行程序的方法,但用户的问题是关于检测安装版本,这部分可能不太相关,但可以暂时忽略,除非有其他相关内容。 另外,除了引用中提到的方法,我还知道注册表查询也是一种常用方式。在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP下可以查看已安装版本。例如,v4或更高版本在Full子项下的Version条目中显示具体版本号。这种方法对于技术用户来说可行,但需要指导步骤,避免误操作。 还有通过命令提示符运行命令,例如reg query来查询注册表项,或者使用PowerShell命令Get-ChildItem来遍历注册表路径,这能快速获取版本信息,适合喜欢命令行操作的用户。 此外,用户可能不知道有第三方工具,比如.NET Version Detector,可以图形化显示所有安装版本。这对普通用户更友好,但需要下载工具。 现在需要把这些方法整理成一个清晰的步骤指南,按照用户不同的使用场景(手动检查、编程检测、命令行工具等)分类,确保每种方法都正确引用来源,并补充必要的细节,比如具体路径或命令示例。同时注意使用正确的LaTeX格式,比如路径中的反斜杠可能需要转义,或者用代码块表示命令。 最后,生成相关问题,引导用户进一步了解如何验证版本检测特定版本是否存在或处理未安装的情况。需要确保问题与主题相关,并覆盖用户可能感兴趣的扩展方向。</think>### 检查已安装.NET Framework版本的方法 #### 方法1:通过系统安装目录查看(手动检查) 在Windows系统中,.NET Framework安装目录通常为: `C:\Windows\Microsoft.NET\Framework` 在此路径下,每个子文件夹对应一个已安装版本(如`v4.0.30319`表示.NET 4.0)。此方法适用于快速查看,但无法直接显示版本名称(如“.NET 4.8”),需通过版本号对应官方文档确认[^1]。 #### 方法2:通过注册表查询(技术用户适用) 1. 打开注册表编辑器(`regedit`),导航至路径: `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP` 2. 展开子项(如`v4`或`v4.0`),检查`Full`子项中的`Version`值,例如: - `4.8.03761`对应.NET Framework 4.8 - `4.7.02556`对应.NET Framework 4.7 #### 方法3:使用命令行工具 **命令提示符:** ```bash reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release ``` 输出中的`Release`值需与[微软官方版本号对照表](https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed)匹配。 **PowerShell:** ```powershell Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version, Release -ErrorAction SilentlyContinue ``` #### 方法4:通过Inno Setup脚本检测(开发者适用) 在安装程序脚本中使用`IsDotNetDetected`函数,示例代码: ```pascal function IsDotNetDetected(const version: string; servicePack: Cardinal): Boolean; // 检查指定版本和服务包是否安装,如检测.NET 4.6: if not IsDotNetDetected('4.6.0', 0) then MsgBox('需要安装.NET Framework 4.6', mbCriticalError, MB_OK); ``` 此方法支持检测4.5及以上版本,需注意版本号需与最终发行版一致[^3]。 #### 方法5:第三方工具 工具如**.NET Version Detector**或**ASoft .NET Version Detector**可图形化显示所有已安装版本,适合非技术用户。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值