如何检测安装了哪些 .NET Framework 版本和服务包?

Posted

技术标签:

【中文标题】如何检测安装了哪些 .NET Framework 版本和服务包?【英文标题】:How do I detect what .NET Framework versions and service packs are installed? 【发布时间】:2010-09-16 23:28:36 【问题描述】:

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

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

【问题讨论】:

这个问题与***.com/questions/198931/…和***.com/questions/182910/…密切相关 是的。我已经知道第一个(这是我在问题中提到的那个)。我不知道另一个。 我对这个问题(包括答案​​)和所有密切相关的问题完全忽略了SKU values 的存在印象深刻——这甚至区分了 4.5 和 4.5.1。 @springy76,这不解决 SKU 值存在的原因是,为了确定安装了哪些版本的框架,它们不相关。您提到的问题实际上是试图确定是否安装了“.NET 4.0.2”。这里的问题是没有 .NET 4.0.2,它是一个更新 (KB2544514),而不是框架版本或服务包。您可以在 MSDN (msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx) 上查看这篇文章,了解有关如何检测安装了哪些更新的更多信息。 这里有Check which version of .net ... 【参考方案1】:

注册表是the official way,用于检测是否安装了特定版本的框架。

根据您要查找的框架版本,需要更改哪些注册表项:

框架版本注册表项 -------------------------------------------------- -------------------------------------- 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,我们使用注册表项本身的名称,它代表版本号。

1234563同样,.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,否则不安装。更多详情请见here和here。

【讨论】:

这似乎不适用于 Vista x64 下的 .NET 1.1。任何可能的地方都没有 v1.1.x 密钥。想法? .NET 4.0 的密钥不太正确。我看到这些键: HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Install HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Install v4.0 文件夹只有一个键, (默认),值为 deprecated。 本帖不涉及4.5,4.5即使安装也未在注册表中列出。 伙计,微软没有人想过添加 -version 开关吗? 开个玩笑。我不敢相信这太愚蠢了!【参考方案2】:

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

它是基于 How to: Determine Which .NET Framework Versions Are Installed 编写的。请使用 Get-FrameworkVersion() 函数获取有关已安装的 .NET 框架版本的信息。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

在 Windows 7 中(它应该也适用于 Windows 8,但我还没有测试过):

转到命令提示符

进入命令提示符的步骤:

    点击开始菜单 在搜索框中,输入“cmd”(不带引号) 打开 cmd.exe

在 cmd 中,输入此命令

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

这提供了最新版本的 NET Framework 安装。

也可以试试Raymond.cc Utilties。

【讨论】:

cmd 中运行该行会得到ERROR: Description = Invalid namespace 我也收到ERROR: Description = Invalid namespace 这个命令给我错误! (从 Windows 7 终端执行) 感谢 MEMark、Peter、Smrita 的通知。【参考方案5】:

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

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

【讨论】:

Win 10 PC 上的附加选项是找到“打开或关闭 Windows 功能”,然后会列出 .NET 框架。【参考方案6】:

使用来自SignumFramework 的Signum.Utilities 库(您可以单独使用),您可以很好地获取它,而无需自己处理注册表:

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

【讨论】:

查看此方法的代码,就它使用的注册表项而言,它不是很完整,并且会完全错过 .NET 1.0 并且不区分 .NET 2.0 (RTM) 和 .NET 2.0 SP1。它也没有考虑框架版本之间的依赖关系。 不是一个好的解决方案。当您可以用大约 3 行代码自己完成相同的工作时,没有充分的理由下载整个库只是为了获得 .NET 版本。作为程序员,您应该能够“自己处理注册表”。 @DannySmurf 我不同意。引入 .NET 3.0 时,MS 应该将其包装在 .NET API 中(只要我们在同一个 CLR 上拥有一层以上的 FX)。我宁愿让我的应用程序使用实用程序库,然后当 4.1、6.1、7.100 到达时,我可以只更新库和我的应用程序需要的 .NET 层的配置条目。当然,如果这些库都不起作用,这个论点就站不住脚。【参考方案7】:

请参阅 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 及更高版本”还有另一个功能。

【讨论】:

【参考方案8】:

.NET 4.5.1 更新

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

【讨论】:

【参考方案9】:

我需要找出我的计算机上的 .NET 框架版本,我所做的只是转到控制面板并选择“卸载程序”选项。之后,我按名称对程序进行了排序,找到了 Microsoft .NET Framework 4 Client Profile。

【讨论】:

谢谢——我尝试过的所有其他“解决方案”都有缺陷并且无法正常工作。确实如此。 我来寻找此信息的原因是卸载程序下的内容完全不可靠,至少在涉及 .NET Framework 时是如此。【参考方案10】:

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

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

【讨论】:

这只是“有点”真实。 64 位版本的 Windows 中的注册表分为 32 位和 64 位键(许多 32 位键与 64 位键同名)。 Wow6432Node 注册表项是 WOW64 注册表反射器的一部分,它反映了 64 位和 32 位注册表视图之间的某些键和值。由于注册表会自动处理重定向和镜像,因此无需直接访问此键。【参考方案11】:

以下知识库文章中对此问题有 Microsoft 官方回答:

Article ID: 318785 - Last Review: November 7, 2008 - Revision: 20.1 How to determine which versions of the .NET Framework are installed and whether service packs have been applied

不幸的是,它似乎不起作用,因为 2.0 目录中的 mscorlib.dll 版本有 2.0 版本,而 3.0 或 3.5 目录中没有 mscorlib.dll 版本,即使安装了 3.5 SP1 。 ..为什么微软官方的回答会如此错误?

【讨论】:

+1 - 自从您最初链接到该页面后,微软似乎已经更新了该页面。所以看起来这可能是关于此事的最佳官方消息来源之一。 只能升到4.0【参考方案12】:

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

【讨论】:

我没有在我的机器 (XP Pro) 上找到这个密钥,但我确实有这个:HKLM\SOFTWARE\Microsoft\.NETFramework。但是,您描述的各种价值观对我来说并不存在。 如果您安装了 .NET 1.1 或更高版本,您应该拥有此密钥。您提到的密钥仅用于 .NET 1.0。 reg 查询“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP”【参考方案13】:

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") 以避免非管理员用户出现安全异常。 酷,我使用了 LinqPad,它给了我完美的结果! share.linqpad.net/5cjihh.linq 奇怪的是,您分享了一些小细节(例如安装了哪个服务包版本),但您的代码忽略了更重要的信息(如果仅部分或完全安装了框架)!将注册表项“Client”和“Full”视为相同是错误的。如果仅“客户端”键退出,例如 System.Web 将不可用。您的代码也应返回此重要信息!如果用户在控制面板中卸载了“.NET Framework 4 Extended”,将会丢失几个程序集。

以上是关于如何检测安装了哪些 .NET Framework 版本和服务包?的主要内容,如果未能解决你的问题,请参考以下文章

确定安装了哪些 NET Framework 版本

系统已安装了哪些 NET Framework 版本

检测电脑安装的net framework版本

netframework由于设备错误

部署Microsoft .NET Framework 3.0[翻译]

如何查看c#的版本.net framework