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


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

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

Answers


Реестр является официальным способом обнаружения, если установлена ​​определенная версия 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 ).

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

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 установлен, иначе это не так. Более подробную информацию можно найти здесь и здесь .




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

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

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




Бета-версия 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);
            }
        }
    }
}



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




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

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




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




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

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



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

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




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

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




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




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




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

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












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




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