关于安装:如何检测安装的.NET Framework版本和Service Pack?

How do I detect what .NET Framework versions and service packs are installed?

这里也提出了类似的问题,但它是特定于.NET 3.5的。具体来说,我在寻找以下内容:

  • 确定安装了哪些.NET Framework版本和Service Pack的正确方法是什么?
  • 是否有可以使用的注册表项列表?
  • 框架版本之间是否存在依赖关系?

  • 注册表是检测是否安装了框架的特定版本的官方方法。

    enter image description here

    根据您要查找的框架版本,需要更改哪些注册表项:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Framework Version  Registry Key
    ------------------------------------------------------------------------------------------
    1.0                HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705
    1.1                HKLM\Software\Microsoft
    ET Framework Setup
    DP\v1.1.4322\Install
    2.0                HKLM\Software\Microsoft
    ET Framework Setup
    DP\v2.0.50727\Install
    3.0                HKLM\Software\Microsoft
    ET Framework Setup
    DP\v3.0\Setup\InstallSuccess
    3.5                HKLM\Software\Microsoft
    ET Framework Setup
    DP\v3.5\Install
    4.0 Client Profile HKLM\Software\Microsoft
    ET Framework Setup
    DP\v4\Client\Install
    4.0 Full Profile   HKLM\Software\Microsoft
    ET Framework Setup
    DP\v4\Full\Install

    一般来说,您需要:

    1
    "Install"=dword:00000001

    除了.NET 1.0,其中值是字符串(REG_SZ而不是数字(REG_DWORD)。

    确定Service Pack级别遵循类似的模式:

    2

    如您所见,如果在Windows Media Center或Windows XP Tablet Edition上运行,则确定.NET 1.0的SP级别将发生更改。同样,.NET 1.0使用字符串值,而其他所有的都使用双字。

    对于.NET 1.0,这些键中任何一个的字符串值的格式都为、、、、、、。最后一个是服务包级别。

    虽然我没有明确要求,但是如果您想知道框架的确切版本号,您可以使用这些注册表项:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Framework Version  Registry Key
    ------------------------------------------------------------------------------------------
    1.0                HKLM\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version
    1.0[1]             HKLM\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\Version
    1.1                HKLM\Software\Microsoft
    ET Framework Setup
    DP\v1.1.4322
    2.0[2]             HKLM\Software\Microsoft
    ET Framework Setup
    DP\v2.0.50727\Version
    2.0[3]             HKLM\Software\Microsoft
    ET Framework Setup
    DP\v2.0.50727\Increment
    3.0                HKLM\Software\Microsoft
    ET Framework Setup
    DP\v3.0\Version
    3.5                HKLM\Software\Microsoft
    ET Framework Setup
    DP\v3.5\Version
    4.0 Client Profile HKLM\Software\Microsoft
    ET Framework Setup
    DP\v4\Version
    4.0 Full Profile   HKLM\Software\Microsoft
    ET Framework Setup
    DP\v4\Version

    [1] Windows Media Center or Windows XP Tablet Edition
    [2] .NET 2.0 SP1
    [3] .NET 2.0 Original Release (RTM)

    同样,.NET 1.0使用字符串值,而其他所有的都使用双字。

    附加说明

    • 对于.NET 1.0,这些键中任何一个的字符串值的格式都为#,#,####,#。字符串的#,#,####部分是框架版本。

    • 对于.NET 1.1,我们使用注册表项本身的名称,它表示版本号。

    • 最后,如果查看依赖项,.NET 3.0会向.NET 2.0添加其他功能,因此.NET 2.0和.NET 3.0都必须在正确安装时计算,以正确地表示已安装.NET 3.0。同样,.NET 3.5为.NET 2.0和.NET 3.0添加了附加功能,因此.NET 2.0,.NET 3.0和.NET 3.如果所有的计算结果都正确地表示安装了.NET 3.5。

    • .NET 4.0安装了新版本的clr(clr版本4.0),它可以与clr 2.0并行运行。

    .NET 4.5的更新

    如果安装了.NET 4.5,注册表中就不会有v4.5键。相反,您必须检查HKLM\Software\Microsoft
    ET Framework Setup
    DP\v4\Full
    键是否包含名为Release的值。如果存在该值,则安装.NET 4.5,否则不安装.NET 4.5。在这里和这里可以找到更多的细节。


    微软在以下知识库文章中对此问题给出了官方答案:

    文章ID:318785-上次审查:2008年11月7日-修订:20.1如何确定安装了.NET Framework的哪些版本以及是否应用了Service Pack

    不幸的是,它似乎不起作用,因为2.0目录中的mscorlib.dll版本是2.0版本,而且3.0或3.5目录中没有mscorlib.dll版本,即使安装了3.5 SP1…为什么微软官方的回答会如此错误?


    框架4测试版安装到不同的注册表项。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    using System;
    using System.Collections.ObjectModel;
    using Microsoft.Win32;

    class Program
    {
        static void Main(string[] args)
        {
            foreach(Version ver in InstalledDotNetVersions())
                Console.WriteLine(ver);

            Console.ReadKey();
        }


        public static Collection<Version> InstalledDotNetVersions()
        {
            Collection<Version> versions = new Collection<Version>();
            RegistryKey NDPKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft
    ET Framework Setup
    DP");
            if (NDPKey != null)
            {
                string[] subkeys = NDPKey.GetSubKeyNames();
                foreach (string subkey in subkeys)
                {
                    GetDotNetVersion(NDPKey.OpenSubKey(subkey), subkey, versions);
                    GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Client"), subkey, versions);
                    GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Full"), subkey, versions);
                }
            }
            return versions;
        }

        private static void GetDotNetVersion(RegistryKey parentKey, string subVersionName, Collection<Version> versions)
        {
            if (parentKey != null)
            {
                string installed = Convert.ToString(parentKey.GetValue("Install"));
                if (installed =="1")
                {
                    string version = Convert.ToString(parentKey.GetValue("Version"));
                    if (string.IsNullOrEmpty(version))
                    {
                        if (subVersionName.StartsWith("v"))
                            version = subVersionName.Substring(1);
                        else
                            version = subVersionName;
                    }

                    Version ver = new Version(version);

                    if (!versions.Contains(ver))
                        versions.Add(ver);
                }
            }
        }
    }


    枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
    ET Framework Setup
    DP
    的子键。每个子项都是.NET版本。如果机器上有Install=1值,显示服务包的sp值和使用msi安装的MSI=1值。(例如,Windows Vista上的.NET 2.0没有最后一个,因为它是操作系统的一部分。)


    i想要检测的存在。NET版本4.5.2安装在我的系统,我发现没有更好的解决方案比asoft .NET版本的探测器。

    这显示不同的快照工具。NET版本:

    Snapshot of this tool showing different .NET versions


    有一个可用的GUI工具,asoft .NET版本的探测器,它一直被证明非常可靠。它可以创建XML文件的XML文件的名称指定一个命令行输出。

    你可以使用本研究的自动化。这是一个小程序,写在。NET语言非依赖性和不需要安装。


    更新for .NET 4.5.1

    现在是可用的。NET 4.5.1《实际价值的关键命名发布在注册表中不需要,不只是它的存在。a价值意味378758 4.5.1是。NET框架安装。然而,这里描述的是一个在Windows 378675 8.1本价值。


    对于64位操作系统,路径为:

    1
    2
    3
    HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft
    ET Framework Setup
    DP\


    我需要找出我的计算机上的.NET框架的版本,我所做的就是进入控制面板并选择"卸载程序"选项。之后,我按名称对程序进行了排序,找到了Microsoft.NET Framework 4客户端配置文件。


    这里是一个PowerShell脚本获取安装.NET Framework版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    function Get-KeyPropertyValue($key, $property)
    {
        if($key.Property -contains $property)
        {
            Get-ItemProperty $key.PSPath -name $property | select -expand $property
        }
    }

    function Get-VersionName($key)
    {
       $name = Get-KeyPropertyValue $key Version
       $sp = Get-KeyPropertyValue $key SP
       $install = Get-KeyPropertyValue $key Install
       if($sp)
       {
           "$($_.PSChildName) $name SP $sp"
       }
       else{
       "$($_.PSChildName) $name"
       }
    }

    function Get-FrameworkVersion{
       dir"hklm:\SOFTWARE\Microsoft
    ET Framework Setup
    DP" |? {$_.PSChildName -like"v*"} |%{
        if( $_.Property -contains"Version")
        {
            Get-VersionName $_
        }
        else{
            $parent = $_
            Get-ChildItem $_.PSPath |%{
                $versionName = Get-VersionName $_
               "$($parent.PSChildName) $versionName"
                }
            }
        }
    }


    $v4Directory ="hklm:\SOFTWARE\Microsoft
    ET Framework Setup
    DP\v4\Full"
    if(Test-Path $v4Directory)
    {
        $v4 = Get-Item $v4Directory
        $version = Get-KeyPropertyValue $v4 Release
        switch($version){
            378389 {".NET Framework 4.5"; break;}
            378675 {".NET Framework 4.5.1 installed with Windows 8.1 or Windows Server 2012 R2"; break;}
            378758 {".NET Framework 4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2"; break;}
            379893 {".NET Framework 4.5.2"; break;}
            { 393295, 393297 -contains $_} {".NET Framework 4.6"; break;}
            { 394254, 394271 -contains $_} {".NET Framework 4.6.1"; break;}
            { 394802, 394806 -contains $_} {".NET Framework 4.6.2"; break; }
        }
    }

    它是基于如何写:这是安装.NET Framework的版本确定。请使用"GET frameworkversion()函数得到的信息对安装.NET Framework的版本。


    使用signumframework中的signum.utilities库(可以单独使用),您可以很好地获得它,而无需单独处理注册表:

    4


    (它应该工作在Windows 7的Windows 8因此, ;但我还没有测试它):

    去一个命令提示符

    步骤:去一个命令提示符

  • 点击开始菜单
  • 在搜索框,类型"cmd"(没有引号)
  • 开放cmd.exe
  • 本命令在CMD型

    1
    2
    wmic /namespace:\
    oot\cimv2 path win32_product where"name like '%%.NET%%'" get version

    这给安装最新版本的.NET Framework。

    一个可以尝试同一个raymond.cc公用事业。


    请参阅如何:确定安装了哪些.NET框架版本(msdn)。

    对于版本1-4,msdn提出了一个函数示例。根据本文,方法输出为:

    1
    2
    3
    4
    5
    6
    v2.0.50727  2.0.50727.4016  SP2
    v3.0  3.0.30729.4037  SP2
    v3.5  3.5.30729.01  SP1
    v4
      Client  4.0.30319
      Full  4.0.30319

    请注意,对于"4.5及更高版本",还有另一个功能。