此处提出了类似的问题,但它特定于 .NET 3.5。具体来说,我正在寻找以下内容:
- 确定安装了哪些 .NET Framework 版本和服务包的正确方法是什么?
- 是否有可以使用的注册表项列表?
- 框架版本之间是否存在依赖关系?
此处提出了类似的问题,但它特定于 .NET 3.5。具体来说,我正在寻找以下内容:
注册表是检测是否安装了特定版本的框架的官方方法。
根据您正在寻找的框架版本,需要更改哪些注册表项:
框架版本注册表项 -------------------------------------------------- -------------------------------------- 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 客户端配置文件 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Install 4.0 完整配置文件 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Install
一般来说,您正在寻找:
"Install"=dword:00000001
.NET 1.0 除外,其中值是字符串 ( REG_SZ
) 而不是数字 ( REG_DWORD
)。
确定服务包级别遵循类似的模式:
框架版本注册表项 -------------------------------------------------- -------------------------------------- 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 框架设置\NDP\v1.1.4322\SP 2.0 HKLM\Software\Microsoft\NET 框架设置\NDP\v2.0.50727\SP 3.0 HKLM\Software\Microsoft\NET 框架设置\NDP\v3.0\SP 3.5 HKLM\Software\Microsoft\NET 框架设置\NDP\v3.5\SP 4.0 客户端配置文件 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Servicing 4.0 完整配置文件 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Servicing [1] Windows Media Center 或 Windows XP 平板电脑版
如您所见,如果您在 Windows Media Center 或 Windows XP Tablet Edition 上运行,确定 .NET 1.0 的 SP 级别会发生变化。同样,.NET 1.0 使用字符串值,而所有其他都使用 DWORD。
对于 .NET 1.0,这些键中的任何一个的字符串值的格式为 #,#,####,#。最后一个# 是Service Pack 级别。
虽然我没有明确要求这样做,但如果您想知道框架的确切版本号,您可以使用以下注册表项:
框架版本注册表项 -------------------------------------------------- -------------------------------------- 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 框架设置\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 客户端配置文件 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 平板电脑版 [2] .NET 2.0 SP1 [3] .NET 2.0 原始版本 (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 并行运行。
v4.5
如果安装了 .NET 4.5,注册表中将没有键。相反,您必须检查HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full
键是否包含名为Release
. 如果存在此值,则安装 .NET 4.5,否则不安装。更多细节可以在这里和这里找到。
在以下知识库文章中,微软官方对此问题的回答:
文章 ID:318785 - 上次审核:2008 年 11 月 7 日 - 修订:20.1 如何确定安装了哪些版本的 .NET Framework 以及是否已应用服务包
不幸的是,它似乎不起作用,因为 2.0 目录中的 mscorlib.dll 版本有 2.0 版本,并且即使安装了 3.5 SP1,3.0 或 3.5 目录中也没有 mscorlib.dll 版本......为什么微软的官方答案会如此误导吗?
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);
}
}
}
}
我想检测我的系统上是否安装了 .NET 版本 4.5.2,但我发现没有比ASoft .NET Version Detector更好的解决方案。
此工具的快照显示了不同的 .NET 版本:
枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
. 每个子项都是一个.NET版本。如果它存在于机器上,它应该具有Install=1
价值,一个显示服务包的 SP 值和一个MSI=1
值,如果它是使用 MSI 安装的。(例如,Windows Vista 上的 .NET 2.0 没有最后一个,因为它是操作系统的一部分。)
对于 64 位操作系统,路径为:
HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
现在 .NET 4.5.1 可用,需要检查注册表中名为 Release 的键的实际值,而不仅仅是它的存在。值 378758 表示已安装 .NET Framework 4.5.1。但是,如此处所述,此值在 Windows 8.1 上为 378675。
有一个 GUI 工具可用,ASoft .NET 版本检测器,它一直被证明是高度可靠的。它可以通过在命令行上指定 XML 输出的文件名来创建 XML 文件。
您可以将其用于自动化。它是一个小程序,用不依赖于 .NET 的语言编写,不需要安装。
我需要找出我的计算机上的 .NET 框架版本,我所做的只是转到控制面板并选择“卸载程序”选项。之后,我按名称对程序进行了排序,并找到了 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库(您可以单独使用),您可以很好地获得它,而无需自己处理注册表:
AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
请参阅如何:确定安装了哪些 .NET Framework 版本(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 及更高版本”,还有另一个功能。
在 Windows 7 中(它也应该适用于 Windows 8,但我还没有测试过):
转到命令提示符
进入命令提示符的步骤:
在 cmd 中,键入此命令
wmic /namespace:\\root\cimv2 path win32_product where "name like '%%.NET%%'" get version
这样就安装了最新版本的 NET Framework。
也可以尝试Raymond.cc Utilties。