Как определить, какие версии и пакеты обновлений .NET Framework установлены?

Аналогичный вопрос был задан здесь, но он был специфичен для .NET 3.5. В частности, я ищу следующее:

  • Каков правильный способ определить, какие версии и пакеты обновлений .NET Framework установлены?
  • Есть ли список ключей реестра, которые можно использовать?
  • Существуют ли зависимости между версиями Framework?

Ответ 1

Реестр является официальным способом обнаружения, если установлена определенная версия Framework.

enter image description here

Какие ключи реестра необходимо изменить в зависимости от версии 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).

Определение уровня пакета обновления соответствует аналогичной схеме:

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

Как вы можете видеть, определение уровня SP для.NET 1.0 изменяется, если вы работаете в Windows Media Center или Windows XP Tablet Edition. Опять же,.NET 1.0 использует строковое значение, а все остальные используют DWORD.

Для.NET 1.0 строковое значение на любом из этих ключей имеет формат #, #, ####, #. Последний # - это уровень пакета обновления.

Хотя я явно не просил об этом, если вы хотите узнать точный номер версии 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

В.NET 4.0 не будет ключа v4.5 в реестре. Вместо этого вы должны проверить, содержит ли ключ HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full значение Release. Если это значение присутствует,.NET 4.5 установлен, иначе это не так. Более подробную информацию можно найти здесь и здесь.

Ответ 2

Существует официальный ответ Microsoft на этот вопрос в следующей статье базы знаний:

Код статьи: 318785 - Последнее изменение:: 7 ноября 2008 г. - Редакция: 20.1 Как определить, какие версии .NET Framework установлены и применяются ли пакеты обновления

К сожалению, он не работает, потому что версия mscorlib.dll в каталоге 2.0 имеет версию 2.0, а версия mscorlib.dll отсутствует в каталогах 3.0 или 3.5, хотя установлен 3.5 SP1... почему официальный ответ Microsoft будет настолько дезинформирован?

Ответ 3

Бета-версия Framework 4 устанавливается в другой раздел реестра.

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);
            }
        }
    }
}

Ответ 4

Перечислить подразделы HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Каждый подраздел является .NET. Он должен иметь значение Install=1, если оно присутствует на машине, значение SP, которое показывает пакет обновления и значение MSI=1, если оно было установлено с использованием MSI. (.NET 2.0 на Windows Vista не имеет последнего, например, поскольку он является частью ОС.)

Ответ 5

Я хотел обнаружить наличие .NET версии 4.5.2, установленного в моей системе, и не нашел лучшего решения, чем ASoft.NET версии Detector.

Снимок этого инструмента, показывающий разные версии .NET:

Snapshot of this tool showing different .NET versions

Ответ 6

Для 64-разрядной ОС путь будет следующим:

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

Ответ 7

FWIW... вот еще одно решение, которое, похоже, было широко протестировано в реальном мире (но оно находится в C)

Ответ 8

Обновление для .NET 4.5.1

Теперь, когда .NET 4.5.1 доступен, фактическое значение ключа с именем Release в реестре должно быть проверено, а не только его существование. Значение 378758 означает, что установлена ​​.NET Framework 4.5.1. Однако, как описано здесь, это значение 378675 для Windows 8.1.

Ответ 9

Имеется доступный графический интерфейс, ASoft.NET Version Detector, который всегда оказался очень надежным. Он может создавать файлы XML, указывая имя файла XML-вывода в командной строке.

Вы можете использовать это для автоматизации. Это крошечная программа, написанная на языке, не зависящем от .NET, и не требует установки.

Ответ 10

Мне нужно было выяснить, какая версия .NET Framework у меня на компьютере, и все, что я сделал, это перейти на панель управления и выбрать опцию "Удалить программу". После этого я отсортировал программы по имени и нашел профиль клиента Microsoft.NET Framework 4.

Ответ 11

Вот PowerShell script для получения установленных версий платформы .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 установлены. Для получения информации об установленных версиях .NET Framework используйте функцию Get-FrameworkVersion().

Ответ 12

Используя библиотеку Signum.Utilities из SignumFramework (который вы можете использовать автономно), вы можете получить его красиво и без работы с реестром самостоятельно:

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

Ответ 13

Способы Signum.Utilities по-прежнему интересны.

Ответ 15

В 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 для того же самого.

Ответ 17

См. Как определить, какие версии .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 и более поздних" есть еще одна функция.