.NET Framework 版本和依赖关系
用户可在他们的计算机上安装和运行 .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_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 月更新上: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_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 的版本密钥。
 

3、使用 PowerShell 检查最低版本
使用 PowerShell 命令检查 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 子项“Release”条目的值\。
以下示例检查“Release”条目的值,以确定是否已安装 .NET Framework 4.6.2 或更高版本。 如果安装了此代码,则返回 True,否则返回 False。
(Get-ItemProperty "HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full").Release -ge 394802
  4、使用代码查询注册表
- 
      
使用 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”条目的值,以查找已安装的 .NET Framework 4.5-4.8:
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.
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 = "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"))}")
        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_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 子项的注册表路径与其他子项不同。
1、使用注册表编辑器(较旧的框架版本)
- 
      
在“开始”菜单中,选择“运行”,输入“regedit”,然后选择“确定” 。
必须具有管理凭据才能运行 regedit。
 - 
      
打开与要检查的版本匹配的子项。 使用检测 .NET Framework 1.0 到 4.0部分列出的表。
下图显示了 .NET Framework 3.5 的子项及其 Version 值。

 
2、使用代码查询注册表(较旧的框架版本)
使用 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}");
                }
            }
        }
    }
}
  ' 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}")
                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 - 
          
 
四、请参阅
posted on 2020-11-24 16:02 springsnow 阅读(987) 评论(0) 收藏 举报
                
            
        
浙公网安备 33010602011771号