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

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

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

registry是检测是否安装了特定版本的框架的官方方式 。

在这里输入图像描述

需要哪些registry项更改取决于您正在寻找的框架版本:

框架版本registry项
 -------------------------------------------------- ----------------------------------------
 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安装\ NDP \ v2.0.50727 \ Install 
 3.0 HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v3.0 \ Setup \ InstallSuccess 
 3.5 HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v3.5 \ Install 
 4.0客户端configuration文件HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v4 \ Client \ Install
 4.0完整configuration文件HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v4 \ Full \ Install

一般来说,你正在寻找:

"Install"=dword:00000001 

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

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

框架版本registry项
 -------------------------------------------------- ----------------------------------------
 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安装程序\ NDP \ v2.0.50727 \ SP 
 3.0 HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v3.0 \ SP 
 3.5 HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v3.5 \ SP 
 4.0客户端configuration文件HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v4 \ Client \ Servicing
 4.0完整configuration文件HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v4 \ Full \ Servicing

 [1] Windows Media Center或Windows XP Tablet Edition

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

对于.NET 1.0,这两个键之一的string值的格式为#,#,####,#。 最后一个#是Service Pack级别。

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

框架版本registry项
 -------------------------------------------------- ----------------------------------------
 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安装\ NDP \ v2.0.50727 \ Increment
 3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ Version 
 3.5 HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v3.5 \版本 
 4.0客户端configuration文件HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v4 \版本 
 4.0完整configuration文件HKLM \ Software \ Microsoft \ NET Framework安装\ NDP \ v4 \版本 

 [1] Windows Media Center或Windows XP Tablet Edition
 [2] .NET 2.0 SP1
 [3] .NET 2.0原始版本(RTM)

同样,.NET 1.0使用一个string值,而所有其他的使用一个DWORD。

补充笔记

  • 对于.NET 1.0,这两个键之一的string值的格式为#,#,####,# 。 该string的#,#,####部分是Framework版本。

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

  • 最后,如果您查看依赖关系,.NET 3.0为.NET 2.0添加了额外的function,因此.NET 2.0和.NET 3.0必须同时安装,才能正确地说.NET 3.0已经安装。 同样的,.NET 3.5为.NET 2.0和.NET 3.0增加了额外的function,所以.NET 2.0,.NET 3.0和.NET 3都应该评估为安装正确的说.NET 3.5已经安装。

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

更新.NET 4.5

如果安装了.NET 4.5,则registry中不会有v4.5密钥。 相反,您必须检查HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full键是否包含一个名为Release的值。 如果存在这个值,则安装.NET 4.5,否则不会。 更多细节可以在这里和这里find。

在下面的知识库文章中有一个官方的微软对这个问题的回答:

文章编号: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版本…为什么微软官方的回答会如此错误吗?

Framework 4 beta安装到不同的registry项。

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

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

我想检测我的系统上是否安装了.NET 4.5.2版本,并且找不到比ASoft .NET版本检测器更好的解决scheme。

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

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

FWIW … 这是另一个似乎已经在现实世界中被广泛testing的解决scheme (但它是在C中)

对于64位操作系统,path是:

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

.NET 4.5.1更新

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

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

你可以使用这个自动化。 这是一个很小的程序,用非.NET相关语言编写,不需要安装。

我需要找出我的电脑上有哪个版本的.NET框架,我所做的只是去控制面板,select“卸载程序”选项。 之后,我按名称对程序进行了sorting,并find了Microsoft .NET Framework 4 Client Profile。

这是一个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; } } } 

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

使用SignumFramework的Signum.Utilities库(可以独立使用),您可以很好地使用它,而无需亲自处理registry:

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

我使用Raymondcc .NET Detector(可以下载https://www.raymond.cc/blog/download/did/1741/ )来检测所有.NET Framework版本。

您还可以检测基于Mscorlib.dll文件版本安装的版本和服务包。 请参阅如何确定安装了Microsoft .NET Framework的哪些版本和Service Pack级别

Signum.Utilities方法仍然是一个有趣的方法。

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

转到命令提示符

转到命令提示符的步骤:

  1. 点击开始菜单
  2. 在search框中,input“cmd”(不含引号)
  3. 打开cmd.exe

在cmd中input这个命令

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

这样就可以安装最新版本的.NET Framework。

也可以尝试Raymond.cc Utilities的相同。

请参阅如何:确定安装哪些.NET Framework版本 (MSDN)。

MSDN提出了一个function的例子,似乎做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和更高版本”还有另一个function。

通过查看registry(.NET Framework 4.5和更高版本)查找.NET Framework版本 – 请参阅如何:确定安装哪些.NET Framework版本 (MSDN)。