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

时间:2008-10-13 21:22:21

标签: .net installation version-detection

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

  1. 确定安装哪些.NET Framework版本和Service Pack的正确方法是什么?
  2. 是否有可以使用的注册表项列表?
  3. Framework版本之间是否有任何依赖关系?

13 个答案:

答案 0 :(得分:363)

注册表为the official way,用于检测是否安装了特定版本的Framework。

enter image description here

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

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 
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

一般来说,您正在寻找:

"Install"=dword:00000001

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

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

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

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

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

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

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)

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

附加说明

  • 对于.NET 1.0,其中任一键的字符串值的格式为#,#,####,#。字符串的#,#,####部分是Framework版本。

  • 对于.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\NET Framework Setup\NDP\v4\Full键是否包含名为Release的值。如果存在此值,则安装.NET 4.5,否则不安装。可以找到更多详细信息herehere

答案 1 :(得分:17)

以下知识库文章中有一个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

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

答案 2 :(得分:16)

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);
            }
        }
    }
}

答案 3 :(得分:8)

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

答案 4 :(得分:6)

我想检测我的系统上是否安装了.NET 4.5.2版本,而且我找不到比 ASoft .NET Version Detector 更好的解决方案。

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

Snapshot of this tool showing different .NET versions

答案 5 :(得分:5)

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

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

答案 6 :(得分:5)

.NET 4.5.1的更新

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

答案 7 :(得分:5)

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

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

答案 8 :(得分:4)

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

答案 9 :(得分:3)

以下是获取已安装的.NET框架版本的PowerShell脚本

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; }
    }
}

它是基于 How to: Determine Which .NET Framework Versions Are Installed 编写的。请使用The Get-FrameworkVersion()函数获取有关已安装的.NET框架版本的信息。

答案 10 :(得分:2)

使用Signum.Utilities中的SignumFramework库(您可以独立使用),您可以很好地获取它,而无需自己处理注册表:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1

答案 11 :(得分:1)

在Windows 7中(它也适用于Windows 8,但我还没有测试过):

转到命令提示符

转到命令提示符的步骤:

  1. 点击开始菜单
  2. 在搜索框中,键入“cmd”(不带引号)
  3. 打开cmd.exe
  4. 在cmd中,输入此命令

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

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

    也可以尝试使用Raymond.cc Utilties

答案 12 :(得分:0)

请参阅 How to: Determine Which .NET Framework Versions Are Installed (MSDN)。

MSDN提出了一个似乎为版本1-4执行工作的功能示例。根据文章,方法输出是:

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及更高版本”,还有另一个功能。