如何检测安装了哪些.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.