如何检测安装了哪些.NET Framework版本和Service Pack?


289

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

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


是的。我已经知道第一个(这是我在问题中提到的那个)。我不知道另一个。
— Scott Dorman

3
我对这个问题(包括答案​​)以及所有密切相关的问题完全忽略了SKU值的印象印象深刻,甚至可以区分4.5和4.5.1。
— springy76 2014年

@ springy76,之所以不能解决SKU值的存在,是因为,为了确定安装了哪个版本的Framework,它们是不相关的。您所指的问题实际上是试图确定是否已安装“ .NET 4.0.2”。这里的问题是没有.NET 4.0.2,它是更新(KB2544514),而不是Framework版本或Service Pack。您可以在MSDN(msdn.microsoft.com/en-us/library/hh925567 ( v=vs.110 ) .aspx)上查看此文章,以获取有关如何检测安装了哪些更新的更多信息。
— Scott Dorman 2014年

在这里,您可以检查.net的版本...
— DanielV

Answers:


365

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

在此处输入图片说明

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

框架版本注册表项
-------------------------------------------------- ----------------------------------------
1.0 HKLM \软件\ Microsoft \ .NETFramework \ Policy \ v1.0 \ 3705 
1.1 HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v1.1.4322 \ Install 
2.0 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v2.0.50727 \安装 
3.0 HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v3.5 \安装 
4.0客户端配置文件HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v4 \ Client \ Install
4.0完整配置文件HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v4 \ Full \ Install

通常,您正在寻找:

"Install"=dword:00000001

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

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

框架版本注册表项
-------------------------------------------------- ----------------------------------------
1.0 HKLM \软件\ Microsoft \活动设置\已安装的组件\ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \版本 
1.0 [1] HKLM \软件\ Microsoft \活动设置\已安装的组件\ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \版本 
1.1 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v1.1.4322 \ SP 
2.0 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v2.0.50727 \ SP 
3.0 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v3.0 \ SP 
3.5 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v3.5 \ SP 
4.0客户端配置文件HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Serviceicing
4.0完整配置文件HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v4 \ Full \ Serviceicing

[1] Windows Media Center或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的确切版本号,可以使用以下注册表项:

框架版本注册表项
-------------------------------------------------- ----------------------------------------
1.0 HKLM \软件\ Microsoft \活动设置\已安装的组件\ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \版本 
1.0 [1] HKLM \软件\ Microsoft \活动设置\已安装的组件\ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \版本 
1.1 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v1.1.4322 
2.0 [2] HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v2.0.50727 \版本 
2.0 [3] HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v2.0.50727 \ Increment
3.0 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v3.0 \版本 
3.5 HKLM \软件\ Microsoft \ NET Framework安装程序\ NDP \ v3.5 \版本 
4.0客户端配置文件HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 
4.0完整配置文件HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 

[1] Windows Media Center或Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3] .NET 2.0原始发行版(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更新

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


1
对于Vista x64下的.NET 1.1,这似乎不起作用。v1.1.x密钥不在任何可能的位置。有想法吗?
— 克里斯·海因斯

7
.NET 4.0的密钥不太正确。我看到这些键:HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework安装程序\ NDP \ v4 \ Full \ Install v4.0文件夹只有一个密钥,(默认值),不建议使用。
— RandomEngy 2010年

2
这篇文章不涵盖4.5,并且4.5(即使已安装)也未在注册表中列出。
— Klas Mellbourn

37
伙计,微软没有人考虑添加-version开关吗?
— gnuchu

2
开个玩笑。我不敢相信这太愚蠢了!
— 亚历克斯·伯斯

17

在以下知识库文章中,Microsoft对此问题提供了官方解答:

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

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


2
+1-自您最初链接到该页面以来,Microsoft似乎已更新了该页面。因此,这似乎可能是此事的最佳官方消息来源之一。
— jpierson 2011年

2
它仅上升到4.0
— user316117 2013年

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

1
进行更改Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)以Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")避免非管理员用户的安全异常。
— 乔恩·凯奇

太酷了,我使用了LinqPad,它给了我完美的结果!share.linqpad.net/5cjihh.linq
— user917170 2015年

您共享小细节(例如安装了哪个Service Pack版本)很奇怪,但是更重要的信息(如果仅部分或完全安装了框架)却被您的代码忽略了!将注册表项“ Client”和“ Full”视为相同是错误的。如果仅退出“客户端”键,例如System.Web将不可用。您的代码也应返回此重要信息!如果用户在控制面板中卸载了“ .NET Framework 4 Extended”,将缺少几个程序集。
— Elmue 2015年


7

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


我在计算机(XP Pro)上找不到此密钥,但确实有此密钥:HKLM \ SOFTWARE \ Microsoft \ .NETFramework。但是,您所描述的各种价值观对我而言并不存在。
— 查理

如果已安装.NET 1.1或更高版本,则应具有此密钥。您提到的密钥仅用于.NET 1.0。
— Scott Dorman

reg查询“ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP”
— enthus1ast 2015年

5

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

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

10
这只是“有点”正确。Windows的64位版本中的注册表分为32位和64位密钥(许多32位密钥与64位密钥具有相同的名称)。的Wow6432Node注册表项是WOW64注册表反射器的一部分,其中的反射镜的64位和32位注册表视图之间某些键和值。注册表将自动处理重定向和镜像,因此无需直接访问此注册表项。
— Scott Dorman 2010年

5

.NET 4.5.1的更新

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


5

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

您可以将其用于自动化。它是一个微型程序,使用与.NET不相关的语言编写,并且不需要安装。


4

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


1
谢谢-我尝试的所有其他“解决方案”都存在缺陷,无法使用。做到了。
— user20493

我寻找该信息的原因是,至少在.NET Framework方面,“卸载程序”下的内容完全不可靠。
— tobbenb3

3

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

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

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


2

使用Signum.Utilities从库SignumFramework(您可以使用独立的),你可以得到它很好,没有处理自己的注册表:

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

2
查看此方法的代码,就它使用的注册表项而言,还不是很完整,它将完全丢失.NET 1.0,并且无法区分.NET 2.0(RTM)和.NET 2.0 SP1。它还没有考虑框架版本之间的依赖性。
— Scott Dorman

2
不是一个好的解决方案。当您可以用大约3行代码自己完成相同的工作时,没有充分的理由下载整个库以获取.NET版本。作为程序员,您应该能够“自行处理注册表”。
— TheSmurf,2009年

3
@DannySmurf我不同意。引入.NET 3.0时,MS应该将其包装在.NET API中(只要我们在同一CLR上只有一层FX)。我希望我的应用程序使用实用程序库,然后在4.1、6.1、7.10到达时,我可以更新该库和应用程序需要的.NET层的配置条目。当然,如果没有一个库起作用,则该论点不会成立。
— yzorg


1

在Windows 7中(它也应适用于Windows 8,但我尚未对其进行测试):

转到命令提示符

转到命令提示符的步骤:

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

在cmd中,键入此命令

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

这提供了已安装的最新版本的NET Framework。

也可以尝试使用Raymond.cc实用工具。


1
运行在该行cmd给我 ERROR: Description = Invalid namespace。
— MEMark 2014年

我也得到ERROR: Description = Invalid namespace
— Peter

这个命令给我错误!(从Windows 7终端执行)
— Smrita,2015年

谢谢MEMark,Peter,Smrita的通知。
— Mayank Agarwal'Feb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.