如何检测安装了哪些 .NET Framework 版本和服务包?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/199080/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 10:19:27  来源:igfitidea点击:

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

.netinstallationversion-detection

提问by Scott Dorman

A similar question was asked here, but it was specific to .NET 3.5. Specifically, I'm looking for the following:

在这里一个类似的问题,但它特定于 .NET 3.5。具体来说,我正在寻找以下内容:

  1. What is the correct way to determine which .NET Framework versions and service packs are installed?
  2. Is there a list of registry keys that can be used?
  3. Are there any dependencies between Framework versions?
  1. 确定安装了哪些 .NET Framework 版本和服务包的正确方法是什么?
  2. 是否有可以使用的注册表项列表?
  3. 框架版本之间是否存在任何依赖关系?

回答by Scott Dorman

The registry is the official wayto detect if a specific version of the Framework is installed.

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

enter image description here

在此处输入图片说明

Which registry keys are needed change depending on the Framework version you are looking for:

需要更改哪些注册表项取决于您要查找的框架版本:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\.NETFramework\Policy\v1.005 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\Install 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Install 
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\InstallSuccess 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\Install 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Install
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Install

Generally you are looking for:

通常,您正在寻找:

"Install"=dword:00000001

except for .NET 1.0, where the value is a string (REG_SZ) rather than a number (REG_DWORD).

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

Determining the service pack level follows a similar pattern:

确定服务包级别遵循类似的模式:

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\NET Framework Setup\NDP\v1.1.4322\SP 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\SP 
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\SP 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\SP 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Servicing
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Servicing

[1] Windows Media Center or Windows XP Tablet Edition

As you can see, determining the SP level for .NET 1.0 changes if you are running on Windows Media Center or Windows XP Tablet Edition. Again, .NET 1.0 uses a string value while all of the others use a DWORD.

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

For .NET 1.0 the string value at either of these keys has a format of #,#,####,#. The last # is the Service Pack level.

对于 .NET 1.0,这些键中的任何一个的字符串值的格式为 #,#,####,#。最后一个 # 是 Service Pack 级别。

While I didn't explicitly ask for this, if you want to know the exact version number of the Framework you would use these registry keys:

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

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\NET Framework Setup\NDP\v1.1.4322 
2.0[2]             HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Version 
2.0[3]             HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Increment
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Version 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\Version 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 

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

Again, .NET 1.0 uses a string value while all of the others use a DWORD.

同样,.NET 1.0 使用字符串值,而所有其他版本都使用 DWORD。

Additional Notes

补充说明

  • for .NET 1.0 the string value at either of these keys has a format of #,#,####,#. The #,#,####portion of the string is the Framework version.

  • for .NET 1.1, we use the name of the registry key itself, which represents the version number.

  • Finally, if you look at dependencies, .NET 3.0 adds additional functionality to .NET 2.0 so both .NET 2.0 and .NET 3.0 must both evaulate as being installed to correctly say that .NET 3.0 is installed. Likewise, .NET 3.5 adds additional functionality to .NET 2.0 and .NET 3.0, so .NET 2.0, .NET 3.0, and .NET 3. should all evaluate to being installed to correctly say that .NET 3.5 is installed.

  • .NET 4.0 installs a new version of the CLR (CLR version 4.0) which can run side-by-side with CLR 2.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 并行运行。

Update for .NET 4.5

.NET 4.5 更新

There won't be a v4.5key in the registry if .NET 4.5 is installed. Instead you have to check if the HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Fullkey contains a value called Release. If this value is present, .NET 4.5 is installed, otherwise it is not. More details can be found hereand here.

v4.5如果安装了 .NET 4.5,则注册表中不会有密钥。相反,您必须检查该HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full键是否包含名为Release. 如果此值存在,则安装 .NET 4.5,否则不安装。可以在此处此处找到更多详细信息。

回答by anon

There is an official Microsoft answer to this question at the following knowledge base article:

在以下知识库文章中有 Microsoft 官方对此问题的回答:

Article ID: 318785 - Last Review: November 7, 2008 - Revision: 20.1 How to determine which versions of the .NET Framework are installed and whether service packs have been applied

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

Unfortunately, it doesn't appear to work, because the mscorlib.dll version in the 2.0 directory has a 2.0 version, and there is no mscorlib.dll version in either the 3.0 or 3.5 directories even though 3.5 SP1 is installed ... why would the official Microsoft answer be so misinformed?

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

回答by midspace

The Framework 4 beta installs to a differing registry key.

Framework 4 beta 安装到不同的注册表项。

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\NET Framework Setup\NDP");
        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);
            }
        }
    }
}

回答by Faisal Mq

I wanted to detect for the presence of .NET version 4.5.2 installed on my system, and I found no better solution than ASoft .NET Version Detector.

我想检测我的系统上是否安装了 .NET 版本 4.5.2,我发现没有比ASoft .NET Version Detector更好的解决方案。

Snapshot of this tool showing different .NET versions:

此工具的快照显示了不同的 .NET 版本:

Snapshot of this tool showing different .NET versions

此工具的快照显示了不同的 .NET 版本

回答by Franci Penov

Enumerate the subkeys of HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Each subkey is a .NETversion. It should have Install=1value if it's present on the machine, an SP value that shows the service pack and an MSI=1value if it was installed using an MSI. (.NET 2.0 on Windows Vista doesn't have the last one for example, as it is part of the OS.)

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

回答by abhishek mehta

For a 64-bit OS, the path would be:

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

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\

回答by JasonMcF

Update for .NET 4.5.1

.NET 4.5.1 更新

Now that .NET 4.5.1 is available the actual value of the key named Release in the registry needs to be checked, not just its existence. A value of 378758 means that .NET Framework 4.5.1 is installed. However, as described herethis value is 378675 on Windows 8.1.

现在 .NET 4.5.1 可用,需要检查注册表中名为 Release 的键的实际值,而不仅仅是它的存在。值 378758 表示已安装 .NET Framework 4.5.1。但是,如此处所述此值在 Windows 8.1 上为 378675。

回答by CarlR

There is a GUI tool available, ASoft .NET Version Detector, which has always proven highly reliable. It can create XML files by specifying the file name of the XML output on the command line.

有一个 GUI 工具可用,ASoft .NET 版本检测器,它一直被证明是高度可靠的。它可以通过在命令行上指定 XML 输出的文件名来创建 XML 文件。

You could use this for automation. It is a tiny program, written in a non-.NET dependent language and does not require installation.

您可以将其用于自动化。它是一个小程序,用非 .NET 依赖语言编写,不需要安装。

回答by Kudzai K

I was needing to find out just which version of .NET framework I had on my computer, and all I did was go to the control panel and select the "Uninstall a Program" option. After that, I sorted the programs by name, and found Microsoft .NET Framework 4 Client Profile.

我需要找出我的计算机上安装的是哪个版本的 .NET 框架,我所做的就是转到控制面板并选择“卸载程序”选项。之后,我按名称对程序进行了排序,并找到了 Microsoft .NET Framework 4 Client Profile。

回答by cezarypiatek

Here is a PowerShell script to obtain installed .NET framework versions

这是一个 PowerShell 脚本,用于获取已安装的 .NET 框架版本

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\NET Framework Setup\NDP\" |? {$_.PSChildName -like "v*"} |%{
    if( $_.Property -contains "Version")
    {
        Get-VersionName $_
    }
    else{
        $parent = $_
        Get-ChildItem $_.PSPath |%{
            $versionName = Get-VersionName $_
            "$($parent.PSChildName) $versionName"
            }
        }
    }
}


$v4Directory = "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\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; }
    }
}

It was written based on How to: Determine Which .NET Framework Versions Are Installed. Please use THE Get-FrameworkVersion() function to get information about installed .NET framework versions.

它是根据如何:确定安装了哪些 .NET Framework 版本编写的。请使用 Get-FrameworkVersion() 函数获取有关已安装 .NET 框架版本的信息。