如何:确定计算机安装了哪些 .NET Framework 版本[转]

用户可在他们的计算机上安装和运行 .NET Framework 的多个版本。 当你开发或部署应用时,你可能需要知道用户的计算机上安装了哪些 .NET Framework 版本。 请注意,.NET Framework 由两个采用不同版本的主要组件构成:

·一组程序集,它们是为应用提供功能的类型与资源的集合。 .NET Framework 和程序集使用相同的版本号。
·公共语言运行时 (CLR),可管理并执行应用的代码。 CLR 由其自己的版本号标识(请参阅.NET Framework 版本和依赖关系)。

若要获取计算机上安装的 .NET Framework 版本的准确列表,你可以在代码中查看注册表或查询注册表,若要查找 CLR 版本,你可以使用工具或代码。

通过查看注册表来查找 .NET Framework 版本 (.NET Framework 1-4)

1).在“开始”菜单上,选择“运行”;
2).在“打开”框中,输入“regedit.exe”,你必须具有管理凭据才能运行 regedit.exe;
3).在注册表编辑器中,打开以下子项:
引用内容 引用内容
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP

安装的版本将在 NDP 子项的下方列出。 版本号存储在“版本”项中。 对于 .NET Framework 4,“版本”项位于客户端或完整子项下(在 NDP 下),或在两个子项下。
注意:注册表中的“NET Framework Setup”文件夹不会以句点开头。



通过查看注册表来查找 .NET Framework 版本(.NET Framework 4.5 和更高版本)

1).在“开始”菜单上,选择“运行”;
2).在“打开”框中,输入“regedit.exe”,你必须具有管理凭据才能运行 regedit.exe;
3).在注册表编辑器中,打开以下子项:
引用内容 引用内容
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full

注意:Full 子项的路径包括 Net Framework 子项,而不包括 .NET Framework。如果 Full 子项不存在,则表示你尚未安装 .NET Framework 4.5 或更高版本。

检查名为 Release 的 DWORD 值。 存在 Release DWORD 表明该计算机上已安装 .NET Framework 4.5 或更新版本。



Release DWORD 的值指示将安装的 .NET Framework 版本:



通过在代码中查询注册表来查找 .NET Framework 版本 (.NET Framework 1-4)

使用 Microsoft.Win32.RegistryKey 类访问 Windows 注册表中 HKEY_LOCAL_MACHINE 下的 Software\Microsoft\NET Framework Setup\NDP\ 子项。

using System;
using Microsoft.Win32;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            GetVersionFromRegistry();
            Console.ReadKey();
        }

        static void GetVersionFromRegistry()
        {
            // Opens the registry key for the .NET Framework entry.
            using (RegistryKey ndpKey =
                RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "").
                OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            {
                // As an alternative, if you know the computers you will query are running .NET Framework 4.5
                // or later, you can use:
                // using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                // RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
                foreach (string versionKeyName in ndpKey.GetSubKeyNames())
                {
                    if (versionKeyName.StartsWith("v"))
                    {

                        RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                        string name = (string)versionKey.GetValue("Version", "");
                        string sp = versionKey.GetValue("SP", "").ToString();
                        string install = versionKey.GetValue("Install", "").ToString();
                        if (install == "") //no install info, must be later.
                            Console.WriteLine(versionKeyName + "  " + name);
                        else
                        {
                            if (sp != "" && install == "1")
                            {
                                Console.WriteLine(versionKeyName + "  " + name + "  SP" + sp);
                            }

                        }
                        if (name != "")
                        {
                            continue;
                        }
                        foreach (string subKeyName in versionKey.GetSubKeyNames())
                        {
                            RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                            name = (string)subKey.GetValue("Version", "");
                            if (name != "")
                                sp = subKey.GetValue("SP", "").ToString();
                            install = subKey.GetValue("Install", "").ToString();
                            if (install == "") //no install info, must be later.
                                Console.WriteLine(versionKeyName + "  " + name);
                            else
                            {
                                if (sp != "" && install == "1")
                                {
                                    Console.WriteLine("  " + subKeyName + "  " + name + "  SP" + sp);
                                }
                                else if (install == "1")
                                {
                                    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
  Client  4.6.01055
  Full  4.6.01055
v4.0
  Client  4.0.0.0

通过在代码中查询注册表来查找 .NET Framework 版本(.NET Framework 4.5 和更高版本)

Release DWORD 的存在表明该计算机上已安装 .NET Framework 4.5 或更高版本。 关键字的值表示已安装的版本。 要检查此关键字,请使用 Microsoft.Win32.RegistryKey 类的 OpenBaseKey 和 OpenSubKey 方法访问 Windows 注册表中 HKEY_LOCAL_MACHINE 下的 Software\Microsoft\NET Framework Setup\NDP\v4\Full 子项。

检查 Release 关键字的值以确定安装的版本。 为了向前兼容,你可以检查是否有一个值大于或等于表中所列的值。 此处是 .NET Framework 版本及相关联的 Release 关键字。



下面是检查是否有大于或等于每个版本的发行关键字值的值的示例:

using System;
using Microsoft.Win32;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Get45or451FromRegistry();
            Console.ReadKey();
        }

        static void Get45or451FromRegistry()
        {
            using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\"))
            {
                if (ndpKey != null && ndpKey.GetValue("Release") != null)
                {
                    Console.WriteLine("Version: " + CheckFor45DotVersion((int)ndpKey.GetValue("Release")));
                }
                else
                {
                    Console.WriteLine("Version 4.5 or later is not detected.");
                }
            }
        }

        static string CheckFor45DotVersion(int releaseKey)
        {
            if (releaseKey >= 394254)
            {
                return "4.6.1 or later";
            }
            if (releaseKey >= 393295)
            {
                return "4.6 or later";
            }
            if ((releaseKey >= 379893))
            {
                return "4.5.2 or later";
            }
            if ((releaseKey >= 378675))
            {
                return "4.5.1 or later";
            }
            if ((releaseKey >= 378389))
            {
                return "4.5 or later";
            }
            // This line 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";
        }
    }
}

该示例生成类似下面内容的输出:

引用内容 引用内容
Version: 4.6.1 or later

使用 Clrver 工具查找当前运行时版本

使用 CLR 版本工具 (Clrver.exe) 决定已安装在计算机上的公共语言运行时的版本。从 Visual Studio 命令提示符处,输入 clrver。 该命令生成类似下面的输出:

引用内容 引用内容
Microsoft (R) .NET CLR Version Tool  Version 4.6.1055.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Versions installed on the machine:
v2.0.50727
v4.0.30319

通过在代码中查询 Environment 类来查找当前运行时版本

查询 Environment.Version 属性,以检索标识当前正在执行代码的运行时版本的 Version 对象。 你可以使用 Version.Major 属性获取主版本标识符(例如,4.0 版的“4”),使用 Version.Minor 属性获取次版本标识符(例如,4.0 版的“0”),或使用 Object.ToString 方法获取完整版本字符串(例如“4.0.30319.18010”,如下面的代码中所示)。 此属性返回一个值,该值反映当前正在执行代码的运行时的版本;它不返回程序集版本或可能已在计算机上安装的运行时的其他版本。

对于 .NET Framework 版本 4、4.5、4.5.1 和 4.5.2,Environment.Version 属性返回字符串表现形式具有窗体 4.0.30319.xxxxx 的 Version 对象。 对于 .NET Framework 4.6,它具有窗体 4.0.30319.42000。

以下是在 Environment.Version 属性中查询运行时版本信息的示例:

using System;
using Microsoft.Win32;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            GetVersionFromEnvironment();
            Console.ReadKey();
        }

        static void GetVersionFromEnvironment()
        {
            Console.WriteLine("Version: " + Environment.Version.ToString());

        }
    }
}

该示例生成类似下面内容的输出:

引用内容 引用内容
Version: 4.0.30319.42000


相关链接

[1].如何:确定安装了哪些 .NET Framework 版本:https://msdn.microsoft.com/zh-cn/library/hh925568.aspx
[2].如何确定已安装的 Microsoft .NET Framework 版本和 Service Pack 级别:https://support.microsoft.com/zh-cn/kb/318785
[3].如何使用 Visual C++.NET 来检测.NET Framework 版本的计算机安装的服务包:https://support.microsoft.com/zh-cn/kb/914135

评论: 0 | 引用: 0 | 查看次数: 3836
发表评论
登录后再发表评论!