添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
侠义非凡的椅子  ·  pandas update mysql - ...·  3 月前    · 
不羁的稀饭  ·  JAX-WS - ...·  1 年前    · 
叛逆的镜子  ·  Node.js RESTful API | ...·  1 年前    · 

本文特定于 .NET Framework。 若要确定安装了哪些 .NET Core、.NET 5+ SDK 和运行时,请参阅 如何检查是否已安装 .NET

你可以在计算机上安装和运行 .NET Framework 的多个版本。

  • 如果要检查自己的计算机上的版本,最简单的方法是通过“控制面板”>“程序”>“程序和功能”进行检查,或者在“设置”中的“应用”>“已安装的应用”下进行检查。 你还可以使用 这些由社区维护的工具
  • 如果你是应用开发者,你可能需要知道应用用户的计算机上安装了哪些 .NET Framework 版本。 注册表 包含计算机上安装的 .NET Framework 版本列表。 你还可以修改 RuntimeInformation.FrameworkDescription 属性
  • 若要查找单独版本化的 CLR 版本,请参阅 查找 CLR 版本
  • .NET Framework 由两个采用不同版本的主要组件构成:

  • 一组程序集,它们是为应用提供功能的类型与资源的集合。 .NET Framework 和程序集使用相同的版本号。 例如,.NET Framework 版本包括 4.5、4.6.1 和 4.7.2。
  • 公共语言运行时 (CLR),可管理并执行应用代码。 单个 CLR 版本通常可支持多个 .NET Framework 版本。 例如,CLR 版本4.0.30319.xxxxx(其中 xxxxx 小于42000)支持 .NET Framework 版本 4 到 4.5.2。 大于或等于4.0.30319.42000 的 CLR 版本支持从 .NET Framework 4.6 开始的 .NET Framework 版本。
  • 有关检测每个版本 .NET Framework 所安装更新的信息,请参阅 如何:确定安装了哪些 .NET Framework 更新

    由社区维护的工具

    可使用社区维护的工具帮助检测安装了哪些 .NET Framework 版本:

  • https://github.com/jmalarcon/DotNetVersions
  • https://github.com/EliteLoser/DotNetVersionLister
  • RuntimeInformation.FrameworkDescription 属性

    若要以编程方式查询应用运行的是哪个 .NET 版本,可以使用 RuntimeInformation.FrameworkDescription 属性。 如果应用在 .NET Framework 上运行,则输出将类似于:

    .NET Framework 4.8.4250.0
    

    相比之下,如果应用在 .NET Core 或 .NET 5+ 上运行,则输出将类似于:

    .NET Core 3.1.9
    .NET 5.0.0
    

    可以使用注册表来检测安装了哪个 .NET Framework 版本。 .NET Framework 1.0-4.0 和 .NET Framework 4.5+ 的注册表项不同。 你可以使用注册表编辑器、PowerShell 或代码来检查注册表。

  • .NET Framework 4.5 及更高版本
  • 注册表编辑器
  • 使用代码进行查询
  • 使用 PowerShell 进行查询
  • .NET Framework 1.0-4.0
  • 注册表编辑器
  • 使用代码进行查询
  • 使用 PowerShell 进行查询
  • .NET Framework 4.5 及更高版本

    计算机上安装的 .NET Framework 版本(4.5 及更高版本)列出在注册表中,位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full。 如果缺少 Full 子项,则未安装 .NET Framework 4.5 或更高版本。

    注册表路径中的 .NET Framework Setup 子项不以句点开头。

    注册表中的 Release REG_DWORD 值代表已安装的 .NET Framework 版本。

    .NET Framework 4.5.1 在 Windows 8.1 和 Windows Server 2012 R2 上:378675
    在所有其他 Windows 操作系统上:378758 .NET Framework 4.5.2 所有 Windows 操作系统:379893 .NET Framework 4.6 在 Windows 10 上:393295
    在所有其他 Windows 操作系统上:393297 .NET Framework 4.6.1 在 Windows 10 11 月更新系统上:394254
    在所有其他 Windows 操作系统(包括 Windows 10)上:394271 .NET Framework 4.6.2 在 Windows 10 周年更新和 Windows Server 2016 上:394802
    在所有其他 Windows 操作系统(包括其他 Windows 10 操作系统)上:394806 .NET Framework 4.7 在 Windows 10 创意者更新上:460798
    在所有其他 Windows 操作系统(包括其他 Windows 10 操作系统)上:460805 .NET Framework 4.7.1 在 Windows 10 Fall Creators Update 和 Windows Server 版本 1709 上:461308
    在所有其他 Windows 操作系统(包括其他 Windows 10 操作系统)上:461310 .NET Framework 4.7.2 在 Windows 10 2018 年 4 月更新和 Windows Server 版本 1803 上:461808
    在除 Windows 10 2018 年 4 月更新和 Windows Server 版本 1803 之外的所有 Windows 操作系统上:461814 .NET Framework 4.8 在 Windows 10 的 2019 年 5 月更新和 Windows 10 的 2019 年 11 月更新上:528040
    在 Windows 10 的 2020 年 5 月更新、2020 年 10 月更新、2021 年 5 月更新、2021 年 11 月更新和 2022 年更新上:528372
    在 Windows 11 和 Windows Server 2022 上:528449
    在所有其他 Windows 操作系统(包括其他 Windows 10 操作系统)上:528049 .NET Framework 4.8.1 在 Windows 11 2022 更新和 Windows 11 2023 更新上:533320
    所有其他 Windows 操作系统:533325

    若要确定是否存在 .NET Framework 的最低版本,请查看大于或等于下列表中列出的相应值的“Release”REG_DWORD 值。 例如,如果应用程序在 .NET Framework 4.8 或更高版本下运行,请测试 Release REG_DWORD 值是否大于或等于 528040。

    .NET Framework 版本

    (必须具有管理凭据才能运行 regedit。)

  • 在注册表编辑器中,打开以下子项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full。 如果“Full”子项不存在,则表示尚未安装 .NET Framework 4.5 或更高版本。

  • 请检查名为“Release”的 REG_DWORD 条目。 如果存在,则已安装 .NET Framework 4.5 或更高版本。 其值对应于 .NET Framework 的特定版本。 以下图为例,“Release”条目的值为 528040,这是 .NET Framework 4.8 的版本密钥。

    使用 PowerShell 检查最低版本

    使用 PowerShell 命令检查“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full”子项的“Release”条目的值。

    以下示例检查“Release”条目的值,以确定是否已安装 .NET Framework 4.6.2 或更高版本。 如果安装了此代码,则返回 True,否则返回 False

    (Get-ItemPropertyValue -LiteralPath 'HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release) -ge 394802
    

    使用代码查询注册表

  • 使用 RegistryKey.OpenBaseKeyRegistryKey.OpenSubKey 方法访问 Windows 注册表中的“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full”子项。

    如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。 可在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子项中找到 32 位注册表。 例如,.NET Framework 4.5 的注册表子项为 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full。

  • 检查 Release REG_DWORD 值以确定已安装的版本。 为了向前兼容,可检查是否有一个值大于或等于 .NET Framework 版本表中所列的值。

    下面的示例检查注册表中 Release 项的值,以查找安装的 .NETFramework 4.5-4.8.1 版本。

    在代码文件顶部添加指令 using Microsoft.Win32Imports Microsoft.Win32(如果尚未这样做)。

    const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
    using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
        if (ndpKey != null && ndpKey.GetValue("Release") != null)
            Console.WriteLine($".NET Framework Version: {CheckFor45PlusVersion((int)ndpKey.GetValue("Release"))}");
            Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
    // Checking the version using >= enables forward compatibility.
    string CheckFor45PlusVersion(int releaseKey)
        if (releaseKey >= 533320)
            return "4.8.1 or later";
        if (releaseKey >= 528040)
            return "4.8";
        if (releaseKey >= 461808)
            return "4.7.2";
        if (releaseKey >= 461308)
            return "4.7.1";
        if (releaseKey >= 460798)
            return "4.7";
        if (releaseKey >= 394802)
            return "4.6.2";
        if (releaseKey >= 394254)
            return "4.6.1";
        if (releaseKey >= 393295)
            return "4.6";
        if (releaseKey >= 379893)
            return "4.5.2";
        if (releaseKey >= 378675)
            return "4.5.1";
        if (releaseKey >= 378389)
            return "4.5";
        // This code should never execute. A non-null release key should mean
        // that 4.5 or later is installed.
        return "No 4.5 or later version detected";
    
    Private Sub Get45PlusFromRegistry()
        Const subkey As String = "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"
        Using ndpKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)
            If ndpKey IsNot Nothing AndAlso ndpKey.GetValue("Release") IsNot Nothing Then
                Console.WriteLine($".NET Framework Version: {CheckFor45PlusVersion(ndpKey.GetValue("Release"))}")
                Console.WriteLine(".NET Framework Version 4.5 or later is not detected.")
            End If
        End Using
    End Sub
    ' Checking the version using >= enables forward compatibility.
    Private Function CheckFor45PlusVersion(releaseKey As Integer) As String
        If releaseKey >= 533320 Then
            Return "4.8.1 or later"
        ElseIf releaseKey >= 528040 Then
            Return "4.8"
        ElseIf releaseKey >= 461808 Then
            Return "4.7.2"
        ElseIf releaseKey >= 461308 Then
            Return "4.7.1"
        ElseIf releaseKey >= 460798 Then
            Return "4.7"
        ElseIf releaseKey >= 394802 Then
            Return "4.6.2"
        ElseIf releaseKey >= 394254 Then
            Return "4.6.1"
        ElseIf releaseKey >= 393295 Then
            Return "4.6"
        ElseIf releaseKey >= 379893 Then
            Return "4.5.2"
        ElseIf releaseKey >= 378675 Then
            Return "4.5.1"
        ElseIf releaseKey >= 378389 Then
            Return "4.5"
        End If
        ' This code should never execute. A non-null release key should mean
        ' that 4.5 or later is installed.
        Return "No 4.5 or later version detected"
    End Function
    

    此示例显示类似以下内容的输出:

    .NET Framework Version: 4.6.1
    

    使用 PowerShell 查询注册表

    下面的示例使用 PowerShell 检查注册表中 Release 项的值,以查找安装的 .NETFramework 4.5-4.8.1 版本:

    $release = Get-ItemPropertyValue -LiteralPath 'HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release
    switch ($release) {
        { $_ -ge 533320 } { $version = '4.8.1 or later'; break }
        { $_ -ge 528040 } { $version = '4.8'; break }
        { $_ -ge 461808 } { $version = '4.7.2'; break }
        { $_ -ge 461308 } { $version = '4.7.1'; break }
        { $_ -ge 460798 } { $version = '4.7'; break }
        { $_ -ge 394802 } { $version = '4.6.2'; break }
        { $_ -ge 394254 } { $version = '4.6.1'; break }
        { $_ -ge 393295 } { $version = '4.6'; break }
        { $_ -ge 379893 } { $version = '4.5.2'; break }
        { $_ -ge 378675 } { $version = '4.5.1'; break }
        { $_ -ge 378389 } { $version = '4.5'; break }
        default { $version = $null; break }
    if ($version) {
        Write-Host -Object ".NET Framework Version: $version"
    } else {
        Write-Host -Object '.NET Framework Version 4.5 or later is not detected.'
    

    此示例遵循版本检查的建议做法:

  • 它会检查 Release 条目的值是否大于或等于已知发布值的值。
  • 按从最新版本到最早版本的顺序检查。
  • .NET Framework 1.0-4.0

    .NET Framework 1.1 到 4.0 的每个版本都作为子项列出,位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP。 下表列出了每个 .NET Framework 版本的路径。 对于大多数版本,都有 Install REG_DWORD 值 1,指示已安装此版本。 在这些子项中,还有一个包含版本字符串的 Version REG_SZ 值。

    注册表路径中的 .NET Framework Setup 子项不以句点开头。

    HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup InstallSuccess REG_DWORD 等于 1 HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5 Install REG_DWORD 等于 1 4.0 客户端配置文件 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client Install REG_DWORD 等于 1 4.0 完整配置文件 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full Install REG_DWORD 等于 1

    如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。 可在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子项中找到 32 位注册表。 例如,.NET Framework 3.5 的注册表子项为 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v3.5。

    请注意,.NET Framework 1.0 子项的注册表路径与其他子项不同。

    使用注册表编辑器(较旧的框架版本)

  • 在“开始”菜单中,选择“运行”,输入“regedit”,然后选择“确定” 。

    必须具有管理凭据才能运行 regedit。

  • 打开与要检查的版本匹配的子项。 使用 .NET Framework 1.0-4.0 部分中的表。

    下图显示了 .NET Framework 3.5 的子项及其 Version 值。

    使用代码查询注册表(较旧的框架版本)

    使用 Microsoft.Win32.RegistryKey 类访问 Windows 注册表中的“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP”子项。

    如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。 可在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子项中找到 32 位注册表。 例如,.NET Framework 3.5 的注册表子项为 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v3.5。

    以下示例查找已安装的 .NET Framework 1-4:

    // Open the registry key for the .NET Framework entry.
    using (RegistryKey ndpKey =
            RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).
            OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
        foreach (var versionKeyName in ndpKey.GetSubKeyNames())
            // Skip .NET Framework 4.5 version information.
            if (versionKeyName == "v4")
                continue;
            if (versionKeyName.StartsWith("v"))
                RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                // Get the .NET Framework version value.
                var name = (string)versionKey.GetValue("Version", "");
                // Get the service pack (SP) number.
                var sp = versionKey.GetValue("SP", "").ToString();
                // Get the installation flag.
                var install = versionKey.GetValue("Install", "").ToString();
                if (string.IsNullOrEmpty(install))
                    // No install info; it must be in a child subkey.
                    Console.WriteLine($"{versionKeyName}  {name}");
                else if (install == "1")
                    // Install = 1 means the version is installed.
                    if (!string.IsNullOrEmpty(sp))
                        Console.WriteLine($"{versionKeyName}  {name}  SP{sp}");
                        Console.WriteLine($"{versionKeyName}  {name}");
                if (!string.IsNullOrEmpty(name))
                    continue;
                // else print out info from subkeys...
                // Iterate through the subkeys of the version subkey.
                foreach (var subKeyName in versionKey.GetSubKeyNames())
                    RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                    name = (string)subKey.GetValue("Version", "");
                    if (!string.IsNullOrEmpty(name))
                        sp = subKey.GetValue("SP", "").ToString();
                    install = subKey.GetValue("Install", "").ToString();
                    if (string.IsNullOrEmpty(install))
                        // No install info; it must be later.
                        Console.WriteLine($"  {versionKeyName}  {name}");
                    else if (install == "1")
                        if (!string.IsNullOrEmpty(sp))
                            Console.WriteLine($"  {subKeyName}  {name}  SP{sp}");
                            Console.WriteLine($"  {subKeyName}  {name}");
    
    ' Opens the registry key for the .NET Framework entry.
    Using ndpKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).
        OpenSubKey("SOFTWARE\Microsoft\NET Framework Setup\NDP\")
        For Each versionKeyName In ndpKey.GetSubKeyNames()
            ' Skip .NET Framework 4.5 and later.
            If versionKeyName = "v4" Then Continue For
            If versionKeyName.StartsWith("v") Then
                Dim versionKey As RegistryKey = ndpKey.OpenSubKey(versionKeyName)
                ' Get the .NET Framework version value.
                Dim name = DirectCast(versionKey.GetValue("Version", ""), String)
                ' Get the service pack (SP) number.
                Dim sp = versionKey.GetValue("SP", "").ToString()
                Dim install = versionKey.GetValue("Install", "").ToString()
                If String.IsNullOrEmpty(install) Then
                    ' No install info; it must be in a child subkey.
                    Console.WriteLine($"{versionKeyName}  {name}")
                ElseIf install = "1" Then
                    If Not String.IsNullOrEmpty(sp) Then
                        Console.WriteLine($"{versionKeyName}  {name}  SP{sp}")
                        Console.WriteLine($"{versionKeyName}  {name}")
                    End If
                End If
                If Not String.IsNullOrEmpty(name) Then
                    Continue For
                End If
                For Each subKeyName In versionKey.GetSubKeyNames()
                    Dim subKey As RegistryKey = versionKey.OpenSubKey(subKeyName)
                    name = DirectCast(subKey.GetValue("Version", ""), String)
                    If Not String.IsNullOrEmpty(name) Then
                        sp = subKey.GetValue("SP", "").ToString()
                    End If
                    install = subKey.GetValue("Install", "").ToString()
                    If String.IsNullOrEmpty(install) Then
                        ' No install info; it must be later.
                        Console.WriteLine($"  {versionKeyName}  {name}")
                    ElseIf install = "1" Then
                        If Not String.IsNullOrEmpty(sp) Then
                            Console.WriteLine($"  {subKeyName}  {name}  SP{sp}")
                            Console.WriteLine($"  {subKeyName}  {name}")
                        End If
                    End If
            End If
    End Using
    

    该示例显示类似于以下内容的输出:

    v2.0.50727  2.0.50727.4927  SP2
    v3.0  3.0.30729.4926  SP2
    v3.5  3.5.30729.4926  SP1
      Client  4.0.0.0
    

    使用 PowerShell 查询注册表(较旧的框架版本)

    下面的示例使用 PowerShell 检查注册表中 Release 项的值,以查找安装的 .NETFramework 1-4 版本:

    Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
    Where-Object { ($_.PSChildName -ne "v4") -and ($_.PSChildName -like 'v*') } |
    ForEach-Object {
        $name = $_.Version
        $sp = $_.SP
        $install = $_.Install
        if (-not $install) {
            Write-Host -Object "$($_.PSChildName)  $($name)"
        elseif ($install -eq '1') {
            if (-not $sp) {
                Write-Host -Object "$($_.PSChildName)  $($name)"
            else {
                Write-Host -Object "$($_.PSChildName)  $($name) SP$($sp)"
        if (-not $name) {
            $parentName = $_.PSChildName
            Get-ChildItem -LiteralPath $_.PSPath |
            Where-Object {
                if ($_.Property -contains 'Version') { $name = $((Get-ItemProperty -Path "Registry::$_").Version) }
                if ($name -and ($_.Property -contains 'SP')) { $sp = $((Get-ItemProperty -Path "Registry::$_").SP) }
                if ($_.Property -contains 'Install') { $install = $((Get-ItemProperty -Path "Registry::$_").Install) }
                if (-not $install) {
                    Write-Host -Object "  $($parentName)  $($name)"
                elseif ($install -eq '1') {
                    if (-not $sp) {
                        Write-Host -Object "  $($_.PSChildName)  $($name)"
                    else {
                        Write-Host -Object "  $($_.PSChildName)  $($name) SP$($sp)"
    

    查找 CLR 版本

    随 .NET Framework 一起安装 .NET Framework CLR 单独进行版本控制。 可通过两种方式检测 .NET Framework CLR 的版本:

  • Clrver 工具
  • Environment.Version 属性
  • Clrver 工具

    使用 CLR 版本工具 (Clrver.exe) 确定计算机上安装了哪些版本的 CLR。 打开 Visual Studio 开发人员命令提示或 Visual Studio 开发人员 PowerShell,输入 clrver

    示例输出:

    Versions installed on the machine:
    v2.0.50727
    v4.0.30319
    

    Environment.Version 属性

    对于 .NET Framework 4.5 及更高版本,请勿使用 Environment.Version 属性来检测 CLR 的版本。 而应当如 .NET Framework 4.5 及更高版本所述查询注册表。

  • 查询 Environment.Version 属性以检索 Version 对象。

    返回的 System.Version 对象标识当前正在执行代码的运行时版本。 它不返回可能已安装在计算机上的程序集版本或其他运行时版本。

    对于 .NET Framework 版本 4、4.5、4.5.1 和 4.5.2,返回的 Version 对象的字符串表示形式为 4.0.30319.xxxxx,其中 xxxxx 小于 42000。 对于 .NET Framework 4.6 及更高版本,它的格式为 4.0.30319.42000。

  • 获得 Version 对象后,按如下方式查询:

  • 对于主要版本标识符(例如,4 表示版本 4.0),请使用 Version.Major 属性。
  • 对于次要版本标识符(例如,0 表示版本 4.0),请使用 Version.Minor 属性
  • 对于整个版本字符串(例如,4.0.30319.18010),请使用 Version.ToString 方法。 此方法返回一个值,该值反映正在执行代码的运行时的版本。 它不返回可能安装在计算机上的程序集版本或其他运行时版本。
  • 以下示例使用 Environment.Version 属性检索 CLR 版本信息:

    Console.WriteLine($"Version: {Environment.Version}");
    
    Console.WriteLine($"Version: {Environment.Version}")
    

    该示例显示类似于以下内容的输出:

    Version: 4.0.30319.18010
    
  • 如何:确定安装了哪些 .NET Framework 更新
  • 故障排除:确定所安装 .NET Framework 的版本和服务包
  • 安装面向开发人员的 .NET Framework
  • .NET Framework 版本和依赖关系
  •