我如何检测什么。net框架版本和服务包被安装?

类似的问题在这里也被问到,但它是针对。net 3.5的。具体来说,我正在寻找以下:

  1. 确定安装了哪些.NET Framework版本和服务包的正确方法是什么?
  2. 是否有可以使用的注册表项列表?
  3. 框架版本之间是否存在依赖关系?
338106 次浏览

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

注册表是官方的方式,用于检测是否安装了特定版本的框架。

enter image description here

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

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)。

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

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 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,这两个键的字符串值的格式是#,#,####,#。字符串的#,#,####部分是框架版本。

  • 对于。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,否则没有。更多细节可以找到在这里在这里

使用SignumFramework中的征。公用事业公司库(你可以单独使用),你可以很好地获得它,而无需自己处理注册表:

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

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

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

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

微软在下面的知识库文章中给出了这个问题的官方答案:

文章编号:318785 -最后评审:2008年11月7日-修订期:20.1

不幸的是,它似乎不能工作,因为在2.0目录中的mscorlib.dll版本有一个2.0版本,并且在3.0或3.5目录中没有mscorlib.dll版本,即使安装了3.5 SP1…为什么微软的官方回答会如此错误?

我需要找出我电脑上的。net框架的版本,我所做的就是打开控制面板,选择“卸载程序”选项。之后,我把程序按名称分类,找到了Microsoft . net Framework 4客户端配置文件。

参见如何:确定安装了哪些.NET框架版本 .NET框架版本 (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及更高版本”,还有另一个函数。

更新。net 4.5.1

现在. net 4.5.1可用了,需要检查注册表中名为Release的键的实际值,而不仅仅是它是否存在。值为378758表示安装了. net Framework 4.5.1。然而,正如在这里所述,在Windows 8.1上这个值是378675。

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

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

在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。

你也可以尝试同样的雷蒙德。cc Utilties

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

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

此工具的快照显示不同的。net版本

下面是一个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框架版本 .NET框架版本编写的。请使用get - frameworkversion()函数获取有关已安装的. net框架版本的信息。