用户可在他们的计算机上安装和运行 .NET Framework 的多个版本。 当你开发或部署应用时,你可能需要知道用户的计算机上安装了哪些 .NET Framework 版本。 注册表包含计算机上安装的 .NET Framework 版本列表。
.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 版本:
-
https://github.com/jmalarcon/DotNetVersions
.NET 2.0 命令行工具。
-
https://github.com/EliteLoser/DotNetVersionLister
PowerShell 2.0 模块。
要了解如何检测已安装的每个 .NET Framework 版本的更新,请参阅操作说明:确定已安装的 .NET Framework 更新。
一、检测 .NET Framework 4.5 及更高版本
计算机上安装的 .NET Framework 版本(4.5 及更高版本)列出在注册表中,位于 HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full。 如果缺少 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 月更新上:528372 在所有其他 Windows 操作系统(包括其他 Windows 10 操作系统)上:528049 |
1、最低版本
若要确定是否存在 .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 |
2、使用注册表编辑器
- 在“开始”菜单中,选择“运行”,输入“regedit”,然后选择“确定” 。
(必须具有管理凭据才能运行 regedit。)
-
在注册表编辑器中,打开以下子项:HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full。 如果“Full”子项不存在,则表示尚未安装 .NET Framework 4.5 或更高版本。
-
请检查名为“Release”的 REG_DWORD 条目。 如果存在,则已安装 .NET Framework 4.5 或更高版本。 其值对应于 .NET Framework 的特定版本。 以下图为例,“Release”条目的值为 528040,这是 .NET Framework 4.8 的版本密钥。
3、使用 PowerShell 检查最低版本
使用 PowerShell 命令检查 HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full 子项“Release”条目的值。
以下示例检查“Release”条目的值,以确定是否已安装 .NET Framework 4.6.2 或更高版本。 如果安装了此代码,则返回 True
,否则返回 False
。
(Get-ItemProperty "HKLM:SOFTWAREMicrosoftNET Framework SetupNDPv4Full").Release -ge 394802
4、使用代码查询注册表
-
使用 RegistryKey.OpenBaseKey 和 RegistryKey.OpenSubKey 方法访问 Windows 注册表中的 HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full 子项。
重要
如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。 可在 HKEY_LOCAL_MACHINESOFTWAREWow6432Node 子项中找到 64 位注册表。 例如,.NET Framework 4.5 的注册表子项为 HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftNET Framework SetupNDPv4Full。
-
检查 Release REG_DWORD 值以确定已安装的版本。 为了向前兼容,可检查是否有一个值大于或等于 .NET Framework 版本表中所列的值。
以下示例检查注册表中“Release”条目的值,以查找已安装的 .NET Framework 4.5-4.8:
const string subkey = @"SOFTWAREMicrosoftNET Framework SetupNDPv4Full";
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.
static string CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 528040)
return "4.8 or later";
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 = "SOFTWAREMicrosoftNET Framework SetupNDPv4Full"
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"))}")
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
If releaseKey >= 528040 Then
Return "4.8 or later"
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
此示例遵循版本检查的建议做法:
- 检查“Release”条目的值是否大于或等于已知版本密钥的值。
- 按从最新版本到最早版本的顺序检查。
二、检测 .NET Framework 1.0 到 4.0
.NET Framework 1.1 到 4.0 的每个版本都作为子项列出在 HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDP。 下表列出了每个 .NET Framework 版本的路径。 对于大多数版本,都有 Install REG_DWORD 值 1
,指示已安装此版本。 在这些子项中,还有一个包含版本字符串的 Version REG_SZ 值。
备注
注册表路径中的 .NET Framework Setup 子项不以句点开头。
Framework 版本 | 注册表子项 | “值” |
---|---|---|
1.0 | HKLMSoftwareMicrosoft.NETFrameworkPolicyv1.03705 | Install REG_SZ 等于 1 |
1.1 | HKLMSoftwareMicrosoftNET Framework SetupNDPv1.1.4322 | Install REG_DWORD 等于 1 |
2.0 | HKLMSoftwareMicrosoftNET Framework SetupNDPv2.0.50727 | Install REG_DWORD 等于 1 |
3.0 | HKLMSoftwareMicrosoftNET Framework SetupNDPv3.0Setup | InstallSuccess REG_DWORD 等于 1 |
3.5 | HKLMSoftwareMicrosoftNET Framework SetupNDPv3.5 | Install REG_DWORD 等于 1 |
4.0 客户端配置文件 | HKLMSoftwareMicrosoftNET Framework SetupNDPv4Client | Install REG_DWORD 等于 1 |
4.0 完整配置文件 | HKLMSoftwareMicrosoftNET Framework SetupNDPv4Full | Install REG_DWORD 等于 1 |
重要
如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。 可在 HKEY_LOCAL_MACHINESOFTWAREWow6432Node 子项中找到 64 位注册表。 例如,.NET Framework 3.5 的注册表子项为 HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftNET Framework SetupNDPv3.5。
请注意,.NET Framework 1.0 子项的注册表路径与其他子项不同。
1、使用注册表编辑器(较旧的框架版本)
-
在“开始”菜单中,选择“运行”,输入“regedit”,然后选择“确定” 。
必须具有管理凭据才能运行 regedit。
-
打开与要检查的版本匹配的子项。 使用检测 .NET Framework 1.0 到 4.0部分列出的表。
下图显示了 .NET Framework 3.5 的子项及其 Version 值。
2、使用代码查询注册表(较旧的框架版本)
使用 Microsoft.Win32.RegistryKey 类访问 Windows 注册表中的 HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDP 子项。
重要
如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。 可在 HKEY_LOCAL_MACHINESOFTWAREWow6432Node 子项中找到 64 位注册表。 例如,.NET Framework 3.5 的注册表子项为 HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftNET Framework SetupNDPv3.5。
以下示例查找已安装的 .NET Framework 1-4:
// Open the registry key for the .NET Framework entry.
using RegistryKey ndpKey =
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).
OpenSubKey(@"SOFTWAREMicrosoftNET Framework SetupNDP");
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}");
}
}
}
}
}
' Opens the registry key for the .NET Framework entry.
Using ndpKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).
OpenSubKey("SOFTWAREMicrosoftNET Framework SetupNDP")
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}")
Else
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}")
Else
Console.WriteLine($" {subKeyName} {name}")
End If
End If
Next
End If
Next
End Using
该示例显示类似于以下内容的输出:
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
三、查找 CLR 版本
随 .NET Framework 一起安装 .NET Framework CLR 单独进行版本控制。 可通过两种方式检测 .NET Framework CLR 的版本:
-
Clrver 工具
使用 CLR 版本工具 (Clrver.exe) 确定计算机上安装了哪些版本的 CLR。 打开 Visual Studio 开发人员命令提示并输入
clrver
。示例输出:
Versions installed on the machine: v2.0.50727 v4.0.30319
-
Environment
类重要
对于 .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
-