.NET Framework 版本和依赖关系

摘要:
注册表包含的列表。安装在计算机上的NETNETFramework版本NETFramework由两个不同版本的主要组件组成:一组程序集,它们是为应用程序提供函数的类型和资源的集合。例如。NET Framework版本包括4.5、4.6.1和4.7.2。单个CLR版本通常支持多个。NET Framework版本。了解如何检测每个已安装版本的更新。NET Framework,请参阅说明:确定已安装。NET Framework更新。其值对应于NET Framework。以下示例检查“Release”项的值,以确定是否安装了.NET Framework 4.6.2或更高版本。

原文:https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed


用户可在他们的计算机上安装和运行 .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 版本:

要了解如何检测已安装的每个 .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.5378389
.NET Framework 4.5.1378675
.NET Framework 4.5.2379893
.NET Framework 4.6393295
.NET Framework 4.6.1394254
.NET Framework 4.6.2394802
.NET Framework 4.7460798
.NET Framework 4.7.1461308
.NET Framework 4.7.2461808
.NET Framework 4.8528040

2、使用注册表编辑器

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

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

  1. 在注册表编辑器中,打开以下子项:HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full。如果“Full”子项不存在,则表示尚未安装 .NET Framework 4.5 或更高版本。

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

.NET Framework 4.5 的注册表项

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、使用代码查询注册表

  1. 使用 RegistryKey.OpenBaseKeyRegistryKey.OpenSubKey 方法访问 Windows 注册表中的 HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full 子项。

    重要

    如果运行的应用是 32 位且在 64 位 Windows 中运行,则注册表路径与前面列出的不同。可在 HKEY_LOCAL_MACHINESOFTWAREWow6432Node 子项中找到 64 位注册表。例如,.NET Framework 4.5 的注册表子项为 HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftNET Framework SetupNDPv4Full。

  2. 检查 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.0HKLMSoftwareMicrosoft.NETFrameworkPolicyv1.03705Install REG_SZ 等于 1
1.1HKLMSoftwareMicrosoftNET Framework SetupNDPv1.1.4322Install REG_DWORD 等于 1
2.0HKLMSoftwareMicrosoftNET Framework SetupNDPv2.0.50727Install REG_DWORD 等于 1
3.0HKLMSoftwareMicrosoftNET Framework SetupNDPv3.0SetupInstallSuccess REG_DWORD 等于 1
3.5HKLMSoftwareMicrosoftNET Framework SetupNDPv3.5Install REG_DWORD 等于 1
4.0 客户端配置文件HKLMSoftwareMicrosoftNET Framework SetupNDPv4ClientInstall REG_DWORD 等于 1
4.0 完整配置文件HKLMSoftwareMicrosoftNET Framework SetupNDPv4FullInstall 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、使用注册表编辑器(较旧的框架版本)

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

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

  2. 打开与要检查的版本匹配的子项。使用检测 .NET Framework 1.0 到 4.0部分列出的表。

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

    .NET Framework 3.5 的注册表项。

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 及更高版本中所述查询注册表。

    1. 查询 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。

    2. 获得 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 版本和依赖关系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇🍖软连接与硬链接安装包制作工具 SetupFactory使用2 API清单下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mac anaconda 在terminal中fbprophet安装过程

首先要安装好conda install pystan 再安装pip install fbprohet 调试的时候报错一:cannot import name 'easter' from 'holidays' holiday版本过高(将版本下载) pip install holidays==0.9.8 依旧解决不了问题,于是整体升级版本 pip instal...

ORM框架:Entity Framework

ORM框架:Entity Framework 1.Entity Framework的概念 什么是ORM 对象-关系映射(Object/Relational Mapping,简称ORM),用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。...

c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥

对于微软开发者来说,每次BUILD大会都是值得期待的。这次也是惊喜满满,除了大众瞩目的WP8.1的发布还有一项会令开发者兴奋的技术出现:.NET NATIVE。下面就来详细了解一下其为何物。 [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]    .Net当初的出现是因为Java...

Win7/8双系统共用蓝牙鼠标

相信不少同学的电脑都是Windows7/8双系统,在双系统切换的时候普通的鼠标并不会因为系统改变而无法使用,而由于蓝牙是一对一传输,当系统连接蓝牙设备的时候,会随机生成一个link ID,Win7 和win8 会生成不同的linkID。因此每次配对都会改变其link ID,所以导致不同OS的蓝牙不能共用,即使是同一蓝牙芯片也不可以。解决方法:首先需要在两个...

云端远程Ubuntu系统进行无桌面Web浏览器自动化测试

【摘要】 利用xvfb提供的显卡帧缓冲区,让浏览器以为有桌面,以达到无桌面系统下测试真实浏览器兼容性的目的。 自动化web界面测试往往需要验证真实浏览器的兼容性,但是云端系统往往并不提供图形化的桌面,所以自动化web界面测试在云端就成为一个问题。本文描述了一个技巧解决这个问题,其主要原理是利用xvfb提供的显卡帧缓冲区,让浏览器以为有桌面。 Install...

通过注册表在文件的右键菜单添加程序快速打开

有时找开一个文件时,总要在打开方式来打开,用多了会感觉很麻烦。所以在注册表添加了一个快捷的右键打开EmEditor菜单。 Win+R打开运行,输入regedit, 在HKEY_CLASSES_ROOT>*>shell下新建一个子项,名为“EmEditor” 在EmEditor项右边数据将其改为“EmEditor”>在EmEditor项...