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

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

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

13 ответов

Решение

Реестр - это официальный способ определить, установлена ​​ли конкретная версия Framework.

Какие разделы реестра необходимы, меняются в зависимости от версии Framework, которую вы ищете:

Раздел реестра версии Framework
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\ Установить 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\ Установить 
3.0                HKLM\ Программное обеспечение \Microsoft\NET Framework Setup\NDP\v3.0\Setup\InstallSuccess 
3.5                HKLM\ Программное обеспечение \Microsoft\NET Framework Setup\NDP\v3.5\Install 
4.0 Профиль клиента HKLM \ Программное обеспечение \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).

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

Раздел реестра версии Framework
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\ Установленные компоненты \{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\ Установленные компоненты \{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\ Версия 
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 Профиль клиента HKLM \ Программное обеспечение \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 Tablet Edition

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

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

Хотя я явно не просил об этом, если вы хотите узнать точный номер версии Framework, вы бы использовали следующие ключи реестра:

Раздел реестра версии Framework
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\ Установленные компоненты \{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\ Установленные компоненты \{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\ Версия 
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\ Программное обеспечение \Microsoft\NET Framework Setup\NDP\v3.0\Version 
3.5                HKLM\ Программное обеспечение \Microsoft\NET Framework Setup\NDP\v3.5\Version 
4.0 Профиль клиента HKLM \ Программное обеспечение \Microsoft\NET Framework Setup\NDP\v4\Version 
4.0 Полный профиль HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 

[1] Windows Media Center или 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

Там не будет v4.5 ключ в реестре, если установлен.NET 4.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);
            }
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

Вот скрипт PowerShell для получения установленных версий.NET Framework

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 Framework.

Используя библиотеку 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 и выше" есть другая функция.

Другие вопросы по тегам