类似的问题被问到here,但它特定于.NET 3.5。具体来说,我正在寻找以下内容:
答案 0 :(得分:363)
注册表为the official way,用于检测是否安装了特定版本的Framework。
根据您要查找的Framework版本,需要更改哪些注册表项:
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
)。
确定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\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的确切版本号,您可以使用这些注册表项:
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,其中任一键的字符串值的格式为#,#,####,#
。字符串的#,#,####
部分是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
项。相反,您必须检查HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full
键是否包含名为Release
的值。如果存在此值,则安装.NET 4.5,否则不安装。可以找到更多详细信息here和here。
答案 1 :(得分:17)
以下知识库文章中有一个Microsoft官方对此问题的回答:
不幸的是,它似乎不起作用,因为2.0目录中的mscorlib.dll版本有2.0版本,即使安装了3.5 SP1,3.0或3.5目录中也没有mscorlib.dll版本。为什么微软官方的回答会被误导?
答案 2 :(得分: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);
}
}
}
}
答案 3 :(得分:8)
枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
的子项。每个子项都是.NET版本。如果它存在于计算机上,它应该具有Install=1
值,如果使用MSI安装,则显示Service Pack的SP值和MSI=1
值。 (例如,Windows Vista上的.NET 2.0没有最后一个,因为它是操作系统的一部分。)
答案 4 :(得分:6)
答案 5 :(得分:5)
对于64位操作系统,路径为:
HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
答案 6 :(得分:5)
现在.NET 4.5.1可用,需要检查注册表中名为Release的键的实际值,而不仅仅是它的存在。值378758表示已安装.NET Framework 4.5.1。但是,如here所述,Windows 8.1上的此值为378675。
答案 7 :(得分:5)
有一个GUI工具, ASoft .NET Version Detector ,它总是被证明是高度可靠的。它可以通过在命令行上指定XML输出的文件名来创建XML文件。
您可以将其用于自动化。它是一个很小的程序,用非.NET依赖语言编写,不需要安装。
答案 8 :(得分:4)
我需要知道我的计算机上有哪个版本的.NET框架,我所做的就是转到控制面板并选择“卸载程序”选项。之后,我按名称对程序进行了排序,找到了Microsoft .NET Framework 4 Client Profile。
答案 9 :(得分:3)
以下是获取已安装的.NET框架版本的PowerShell脚本
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; }
}
}
它是基于 How to: Determine Which .NET Framework Versions Are Installed 编写的。请使用The Get-FrameworkVersion()函数获取有关已安装的.NET框架版本的信息。
答案 10 :(得分:2)
使用Signum.Utilities中的SignumFramework库(您可以独立使用),您可以很好地获取它,而无需自己处理注册表:
AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
答案 11 :(得分:1)
在Windows 7中(它也适用于Windows 8,但我还没有测试过):
转到命令提示符
转到命令提示符的步骤:
在cmd中,输入此命令
wmic /namespace:\\root\cimv2 path win32_product where "name like '%%.NET%%'" get version
这将安装最新版本的.NET Framework。
也可以尝试使用Raymond.cc Utilties。
答案 12 :(得分:0)
请参阅 How to: Determine Which .NET Framework Versions Are Installed (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及更高版本”,还有另一个功能。