注释
本文特定于 .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。 CLR 版本大于或等于 4.0.30319.42000 支持从 .NET Framework 4.6 开始的 .NET Framework 版本。
小窍门
有关检测每个 .NET Framework 版本的已安装 更新 的信息,请参阅 如何:确定安装了哪些 .NET Framework 更新。
社区维护的工具
社区维护的工具可用于帮助检测安装了哪些 .NET Framework 版本:
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 安装程序 子项 不 以句点开头。
注册表中的 Release REG_DWORD 值表示安装的 .NET Framework 版本。
| .NET Framework 版本 | 发布值 |
|---|---|
| .NET Framework 4.5 | 所有 Windows 操作系统:378389 |
| .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 年 10 月更新: 528372 在 Windows 11 和 Windows Server 2022 上: 528449 在所有其他 Windows 操作系统(包括其他 Windows 10 操作系统):528049 |
| .NET Framework 4.8.1 | 关于 Windows 11 2025 更新:533509 在 Windows 11 2022 更新和 Windows 11 2023 更新: 533320 所有其他 Windows 操作系统: 533325 |
最低版本
若要确定 .NET Framework 的最低 版本是否存在,请检查 Release REG_DWORD 值是否大于或等于下表中列出的相应值。 例如,如果应用程序在 .NET Framework 4.8 或更高版本下运行,请测试大于或等于 528040 的 Release REG_DWORD 值。
| .NET Framework 版本 | 最小值 |
|---|---|
| .NET Framework 4.5 | 378389 |
| .NET Framework 4.5.1 | 378675 |
| .NET Framework 4.5.2 | 379893 |
| .NET Framework 4.6 | 393295 |
| .NET Framework 4.6.1 | 394254 |
| .NET Framework 4.6.2 | 394802 |
| .NET Framework 4.7 | 460798 |
| .NET Framework 4.7.1 | 461308 |
| .NET Framework 4.7.2 | 461808 |
| .NET Framework 4.8 | 528040 |
| .NET Framework 4.8.1 | 533320 |
使用注册表编辑器
在 “开始 ”菜单中,选择“ 运行”,输入 regedit,然后选择“ 确定”。
(必须具有管理凭据才能运行 regedit。)
在注册表编辑器中,打开以下子项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full。 如果 完整 子键不存在,则说明没有安装 .NET Framework 4.5 或更高版本。
检查名为 Release 的REG_DWORD条目。 如果存在,则已安装 .NET Framework 4.5 或更高版本。 其值对应于特定版本的 .NET Framework。 在下图中,“ 发布 ”条目的值为 528040,这是 .NET Framework 4.8 的发布密钥。
使用 PowerShell 检查最低版本
使用 PowerShell 命令检查 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 子项的“发布”条目的值。
以下示例检查 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.OpenBaseKey和RegistryKey.OpenSubKey方法访问 Windows 注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full子项。
重要
如果正在运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径将不同于前面列出的路径。 32 位注册表可在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子项中找到。 例如,.NET Framework 4.5 的注册表子项为 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full。
检查 Release REG_DWORD 值以确定已安装的版本。 若要向前兼容,请检查值是否大于或等于 .NET Framework 版本表中列出的值。
以下示例检查注册表中 发布 项的值,以查找已安装的 .NET Framework 4.5-4.8.1 版本。
小窍门
添加指令 using Microsoft.Win32 或 Imports Microsoft.Win32 代码文件的顶部(如果尚未这样做)。
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
using (RegistryKey ndpKey = baseKey.OpenSubKey(subkey))
{
if (ndpKey != null && ndpKey.GetValue("Release") != null)
Console.WriteLine($".NET Framework Version: {CheckFor45PlusVersion((int)ndpKey.GetValue("Release"))}");
else
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 baseKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32),
ndpKey As RegistryKey = baseKey.OpenSubKey(subkey)
If ndpKey IsNot Nothing AndAlso ndpKey.GetValue("Release") IsNot Nothing Then
Console.WriteLine($".NET Framework Version: {CheckFor45PlusVersion(ndpKey.GetValue("Release"))}")
Else
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
Select Case releaseKey
Case >= 533320 : Return "4.8.1 or later"
Case >= 528040 : Return "4.8"
Case >= 461808 : Return "4.7.2"
Case >= 461308 : Return "4.7.1"
Case >= 460798 : Return "4.7"
Case >= 394802 : Return "4.6.2"
Case >= 394254 : Return "4.6.1"
Case >= 393295 : Return "4.6"
Case >= 379893 : Return "4.5.2"
Case >= 378675 : Return "4.5.1"
Case >= 378389 : Return "4.5"
Case Else
Return "No 4.5 or later version detected"
End Select
End Function
该示例显示如下所示的输出:
.NET Framework Version: 4.6.1
使用 PowerShell 查询注册表
以下示例使用 PowerShell 检查注册表中 发布 项的值,以查找已安装的 .NET Framework 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
从 1.1 到 4.0 的每个 .NET Framework 版本在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP中列为子项。 下表列出了每个 .NET Framework 版本的路径。 对于大多数版本,有一个Install REG_DWORD值1指示已安装此版本。 在这些子项中,还有一个Version REG_SZ值,包含一个版本字符串。
注释
注册表路径中的 NET Framework 安装程序 子项 不 以句点开头。
| 框架版本 | 注册表子项 | 价值 |
|---|---|---|
| 1.0 | HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 |
安装 REG_SZ等于 1 |
| 1.1 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322 |
安装 REG_DWORD等于 1 |
| 2.0 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 |
安装 REG_DWORD等于 1 |
| 3.0 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup |
InstallSuccess REG_DWORD等于 1 |
| 3.5 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5 |
安装 REG_DWORD等于 1 |
| 4.0 客户端概况 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client |
安装 REG_DWORD等于 1 |
| 4.0 完整配置 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full |
安装 REG_DWORD等于 1 |
重要
如果正在运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径将不同于前面列出的路径。 32 位注册表可在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子项中找到。 例如,.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 的子项及其 版本 值。
使用代码查询注册表(较旧的框架版本)
使用 Microsoft.Win32.RegistryKey 类访问 Windows 注册表中的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP 子项。
重要
如果正在运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径将不同于前面列出的路径。 32 位注册表可在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子项中找到。 例如,.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. Dispose this object when done.
RegistryKey ndpKey =
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\");
foreach (string 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.
string name = versionKey.GetValue("Version", "").ToString();
// Get the service pack (SP) number.
string sp = versionKey.GetValue("SP", "").ToString();
// Get the installation flag.
string 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}");
else
Console.WriteLine($"{versionKeyName} {name}");
}
if (!string.IsNullOrEmpty(name))
{
versionKey.Dispose();
continue;
}
// Iterate through the subkeys of the version subkey.
foreach (string subKeyName in versionKey.GetSubKeyNames())
{
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name = subKey.GetValue("Version", "").ToString();
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}");
else
Console.WriteLine($" {subKeyName} {name}");
}
// Clean up the subkey object.
subKey.Dispose();
}
versionKey.Dispose();
}
}
ndpKey.Dispose();
' Open the registry key for the .NET Framework entry. Dispose this object when done.
Dim 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 = versionKey.GetValue("Version", "").ToString()
' 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
' Install = 1 means the version is installed.
If Not String.IsNullOrEmpty(sp) Then
Console.WriteLine($"{versionKeyName} {name} SP{sp}")
Else
Console.WriteLine($"{versionKeyName} {name}")
End If
End If
If Not String.IsNullOrEmpty(name) Then
versionKey.Dispose()
Continue For
End If
' Iterate through the subkeys of the version subkey.
For Each subKeyName In versionKey.GetSubKeyNames()
Dim subKey As RegistryKey = versionKey.OpenSubKey(subKeyName)
name = subKey.GetValue("Version", "").ToString()
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}")
Else
Console.WriteLine($" {subKeyName} {name}")
End If
End If
' Clean up the subkey object.
subKey.Dispose()
Next
versionKey.Dispose()
End If
Next
ndpKey.Dispose()
该示例显示类似于以下内容的输出:
v2.0.50727 2.0.50727.4927 SP2
v3.0 3.0.30729.4926 SP2
v3.5 3.5.30729.4926 SP1
v4.0
Client 4.0.0.0
使用 PowerShell 查询注册表(较旧的框架版本)
以下示例使用 PowerShell 检查注册表中 发布 项的值,以查找已安装的 .NET Framework 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.exe 工具
使用 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.0 的主要发布标识符为 4),请使用 Version.Major 属性。
- 对于次要版本标识符(例如版本 4.0 的 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