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

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

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

【问题讨论】:

  • 是的。我已经知道第一个(这是我在问题中提到的那个)。我不知道另一个。
  • 我对这个问题(包括答案​​)和所有密切相关的问题完全忽略了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) 上查看这篇文章,了解有关如何检测安装了哪些更新的更多信息。

标签: .net installation version-detection


【解决方案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,否则不安装。更多详情请见herehere

【讨论】:

  • 这似乎不适用于 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】:

以下知识库文章中对此问题有 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
【解决方案3】:

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”,将会丢失几个程序集。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP 的子键。每个子项都是一个.NET 版本。如果它存在于机器上,它应该有 Install=1 值,一个显示服务包的 SP 值,如果它是使用 MSI 安装的,它应该有一个 MSI=1 值。 (例如,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”
    【解决方案6】:

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

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

    【讨论】:

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

    .NET 4.5.1 更新

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

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

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

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

      【讨论】:

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

      这是一个 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 框架版本的信息。

      【讨论】:

        【解决方案11】:

        使用来自SignumFrameworkSignum.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 层的配置条目。当然,如果这些库都不起作用,这个论点就站不住脚。
        【解决方案12】:

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

        【讨论】:

          【解决方案13】:

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

          也可以试试Raymond.cc Utilties

          【讨论】:

          • cmd 中运行该行会得到ERROR: Description = Invalid namespace
          • 我也收到ERROR: Description = Invalid namespace
          • 这个命令给我错误! (从 Windows 7 终端执行)
          • 感谢 MEMark、Peter、Smrita 的通知。
          猜你喜欢
          • 1970-01-01
          • 2011-08-22
          • 1970-01-01
          • 1970-01-01
          • 2010-10-25
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多