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

290

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

  1. Как правильно определить, какие версии .NET Framework и пакеты обновления установлены?
  2. Есть ли список ключей реестра, которые можно использовать?
  3. Есть ли зависимости между версиями Framework?
Скотт Дорман
источник
2
Этот вопрос тесно связан с stackoverflow.com/questions/198931/… и stackoverflow.com/questions/182910/…
Pascal Paradis
Да, это так. Я уже знал о первом (это тот, на который я ссылаюсь в своем вопросе). Я не знал о другом.
Скотт Дорман
3
Я впечатлен тем, как этот вопрос (включая ответы) и все тесно связанные вопросы полностью игнорируют наличие значений SKU - это даже различает 4.5 и 4.5.1.
springy76
@ springy76, Причина, по которой это не касается наличия значений SKU, заключается в том, что для определения того, какие версии Framework установлены, они не имеют отношения к делу. Вопрос, на который вы ссылаетесь, на самом деле пытается определить, установлен ли «.NET 4.0.2». Проблема здесь в том, что не было .NET 4.0.2, это было обновление (KB2544514), а не выпуск Framework или пакет обновления. Вы можете просмотреть эту статью в MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) для получения дополнительной информации о том, как определить, какие обновления установлены.
Скотт Дорман
Здесь у вас есть Проверка, какая версия .net ...
DanielV

Ответы:

365

Реестр является официальным способом определить, установлена ​​ли конкретная версия 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 \ Программное обеспечение \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ SP 
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ SP 
3.5 HKLM \ Программное обеспечение \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ SP 
4.0 Профиль клиента HKLM \ Программное обеспечение \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Servicing
4.0 Полный профиль HKLM \ Программное обеспечение \ 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 \ Software \ 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, в противном случае это не так. Более подробную информацию можно найти здесь и здесь .

Скотт Дорман
источник
1
Это не работает для .NET 1.1 под Vista x64. Нет ключей v1.1.x в любом из возможных мест. Идеи?
Крис Хайнс
7
Ключи для .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 имеет только один ключ (По умолчанию) со значением не рекомендуется.
RandomEngy
2
Этот пост не охватывает 4.5, а 4.5 не указан в реестре, даже если он установлен.
Klas Mellbourn
37
Чувак, никто в Microsoft не подумал добавить ключ -version?
Гнучу
2
Это шутка. Я не могу поверить, что это оооочень глупо!
Алекс Берт
17

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

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

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

скоро
источник
2
+1 - возможно, Microsoft обновила эту страницу, так как вы изначально ссылались на нее. Похоже, это может быть одним из лучших официальных источников по этому вопросу.
jpierson
2
Это только идет до 4.0
user316117
16

Бета-версия 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);
            }
        }
    }
}
промежуточное пространство
источник
1
Выберите, 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
user917170
Странно, что вы рассказываете о небольших деталях (например, какая версия пакета обновления установлена), но более важная информация (если платформа установлена ​​только частично или полностью) игнорируется вашим кодом !! Неправильно рассматривать ключи реестра «Клиент» и «Полный», как если бы они были одинаковыми. Если только ключ «Клиент» выходит, например, System.Web будет недоступен. Эта важная информация также должна быть возвращена вашим кодом! Если пользователь удалил «.NET Framework 4 Extended» в Панели управления, будет отсутствовать несколько сборок.
Elmue
8

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

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

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

Фейсал Mq
источник
7

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

Франси Пенов
источник
Я не нашел этот ключ на своей машине (XP Pro), но у меня было это: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Тем не менее, различные значения, которые вы описываете, не существуют для меня.
Чарли
У вас должен быть этот ключ, если у вас установлен .NET 1.1 или новее. Ключ, который вы упомянули, использовался только для .NET 1.0.
Скотт Дорман
запрос reg "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
энтузиаст
5

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

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
Абхишек Мехта
источник
10
Это только «несколько» правда. Реестр в 64-разрядных версиях Windows разделен на 32-разрядные и 64-разрядные ключи (многие 32-разрядные ключи имеют то же имя, что и 64-разрядные ключи). Раздел Wow6432Nodeреестра является частью отражателя реестра WOW64, который отражает определенные ключи и значения между 64-разрядным и 32-разрядным представлениями реестра. Нет необходимости напрямую обращаться к этому ключу, поскольку реестр автоматически обрабатывает перенаправление и зеркалирование.
Скотт Дорман
5

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

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

JasonMcF
источник
5

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

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

CarlR
источник
4

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

Кудзай К
источник
1
Спасибо. Любое другое «решение», которое я пробовал, было ошибочным и не работало. Это сделал.
user20493
Причина, по которой я искал эту информацию, заключалась в том, что материал в разделе «Удаление программы» абсолютно ненадежен, по крайней мере, когда речь идет о .NET Framework.
tobbenb3
3

Вот скрипт 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.

cezarypiatek
источник
2

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

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
mapache
источник
2
Рассматривая код для этого метода, он не очень полон в отношении того, какие ключи реестра он использует, и будет полностью отсутствовать в .NET 1.0 и не будет различать .NET 2.0 (RTM) и .NET 2.0 SP1. Он также не учитывает зависимости между версиями фреймворка.
Скотт Дорман
2
Не очень хорошее решение. Нет веской причины загружать целую библиотеку только для того, чтобы получить версию .NET, когда вы можете проделать ту же самую работу самостоятельно с помощью примерно 3 строк кода. Как программист, вы ДОЛЖНЫ быть в состоянии "иметь дело с реестром самостоятельно".
TheSmurf
3
@DannySmurf Я не согласен. Когда был представлен .NET 3.0, MS должен был обернуть это в .NET API (как только у нас было несколько слоев FX на одном CLR). Я предпочел бы, чтобы мое приложение использовало служебную библиотеку, тогда, когда прибудет 4.1, 6.1, 7.100, я могу просто обновить библиотеку и запись конфигурации, для которой требуется уровень моего приложения .NET. Конечно, этот аргумент не выдерживает критики, если ни одна из библиотек не работает.
yzorg
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 и выше» есть другая функция.

Оливье де Ривойр
источник
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 за то же самое.

Маянк Агарвал
источник
1
Запуск этой строки cmdдает мне ERROR: Description = Invalid namespace.
MEMark
я тоже получаю ERROR: Description = Invalid namespace
Питер
Эта команда дает мне ошибку! (выполнено из терминала Windows 7)
Смрита
Спасибо, MEMark, Питер, Смрита за уведомление.
Маянк Агарвал