https://learn.microsoft.com/zh-cn/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed
如何:确定已安装的 .NET Framework 版本
本文内容
备注
本文特定于 .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 版本:
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 版本 | Release 的值 |
---|---|
.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 年更新上: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 版本 | 最小值 |
---|---|
.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。 如果“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.OpenBaseKey 和 RegistryKey.OpenSubKey 方法访问 Windows 注册表中的“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full”子项。
重要
如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。 可在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子项中找到 64 位注册表。 例如,.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.Win32
或 Imports 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"))}");
}
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";
}
此示例显示类似以下内容的输出:
.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 子项不以句点开头。
Framework 版本 | 注册表子项 | “值” |
---|---|---|
1.0 | HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 | Install REG_SZ 等于 1 |
1.1 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322 | Install REG_DWORD 等于 1 |
2.0 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 | Install 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 | 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\ 子项中找到 64 位注册表。 例如,.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\ 子项中找到 64 位注册表。 例如,.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}");
}
else
{
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}");
}
else
{
Console.WriteLine($" {subKeyName} {name}");
}
}
}
}
}
}
该示例显示类似于以下内容的输出:
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 检查注册表中 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-ItemPropertyValue -Path $_.PSPath -Name Version }
if ($name -and ($_.Property -contains 'SP')) { $sp = Get-ItemPropertyValue -Path $_.PSPath -Name SP }
if ($_.Property -contains 'Install') { $install = Get-ItemPropertyValue -Path $_.PSPath -Name 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 工具
使用 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}");
该示例显示类似于以下内容的输出:
Version: 4.0.30319.18010