294

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

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

13 回答 13

370

注册表是检测是否安装了特定版本的框架的官方方法。

在此处输入图像描述

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

框架版本注册表项
-------------------------------------------------- --------------------------------------
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 并行运行。

.NET 4.5 更新

v4.5如果安装了 .NET 4.5,注册表中将没有键。相反,您必须检查HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full键是否包含名为Release. 如果存在此值,则安装 .NET 4.5,否则不安装。更多细节可以在这里这里找到。

于 2008-10-14T02:04:20.587 回答
18

在以下知识库文章中,微软官方对此问题的回答:

文章 ID:318785 - 上次审核:2008 年 11 月 7 日 - 修订:20.1 如何确定安装了哪些版本的 .NET Framework 以及是否已应用服务包

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

于 2010-06-21T17:57:44.140 回答
17

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);
            }
        }
    }
}
于 2010-03-16T00:28:13.690 回答
8

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

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

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

于 2015-04-27T09:12:50.143 回答
7

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

于 2008-10-13T21:37:41.170 回答
5

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

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
于 2010-05-11T13:04:14.583 回答
5

.NET 4.5.1 更新

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

于 2013-12-12T09:44:37.660 回答
5

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

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

于 2013-12-12T21:12:48.553 回答
4

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

于 2012-04-20T07:44:13.237 回答
3

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

于 2016-01-13T18:00:02.910 回答
2

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

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
于 2009-03-13T19:31:12.457 回答
1

请参阅如何:确定安装了哪些 .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 及更高版本”,还有另一个功能。

于 2013-10-24T08:10:37.347 回答
1

在 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

于 2014-04-28T19:48:00.747 回答