在这里提出了类似的问题,但它特定于.NET 3.5。具体来说,我正在寻找以下内容:
- 确定安装哪些.NET Framework版本和Service Pack的正确方法是什么?
- 是否有可以使用的注册表项列表?
- Framework版本之间是否存在任何依赖关系?
在这里提出了类似的问题,但它特定于.NET 3.5。具体来说,我正在寻找以下内容:
Answers:
注册表是检测是否安装了特定版本的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并排运行。
v4.5
如果安装了.NET 4.5,则注册表中将没有密钥。相反,您必须检查HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full
键是否包含名为的值Release
。如果存在此值,则安装.NET 4.5,否则不安装。可以在此处和此处找到更多详细信息。
在以下知识库文章中,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版本...为什么微软的官方答案会如此误导吗?
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);
}
}
}
}
Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)
以Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")
避免非管理员用户的安全异常。
我想检测系统上是否安装了.NET 4.5.2版本,没有比ASoft .NET Version Detector更好的解决方案了。
此工具的快照,显示了不同的.NET版本:
枚举的子项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
。每个子项都是.NET版本。Install=1
如果计算机上存在,则应具有值;显示Service Pack的SP值;MSI=1
如果已使用MSI安装,则应具有值。(例如,Windows Vista上的.NET 2.0没有最后一个,因为它是操作系统的一部分。)
对于64位操作系统,路径为:
HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
Wow6432Node
注册表项是WOW64注册表反射器的一部分,其中的反射镜的64位和32位注册表视图之间某些键和值。注册表将自动处理重定向和镜像,因此无需直接访问此注册表项。
有一个可用的GUI工具ASoft .NET版本检测器,它一直被证明具有高度的可靠性。它可以通过在命令行上指定XML输出的文件名来创建XML文件。
您可以将其用于自动化。它是一个微型程序,使用与.NET不相关的语言编写,并且不需要安装。
这是一个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版本的信息。
使用Signum.Utilities从库SignumFramework(您可以使用独立的),你可以得到它很好,没有处理自己的注册表:
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实用工具。
cmd
给我 ERROR: Description = Invalid namespace
。
ERROR: Description = Invalid namespace