Як визначити, які версії .NET Framework та сервісні пакети встановлені?


289

Аналогічне питання було поставлене тут , але конкретно для .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 ) для отримання додаткової інформації про те, як визначити, які оновлення встановлені.
Скотт Дорман

Відповіді:


365

Реєстр - це офіційний спосіб виявити, чи встановлена ​​конкретна версія Framework.

введіть тут опис зображення

Які ключі реєстру потрібно змінити залежно від версії Framework, яку ви шукаєте:

Ключ реєстру версії рамки
-------------------------------------------------- ----------------------------------------
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 \ Установлені компоненти \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Версія 
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 \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Servising
4.0 Повний профіль HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Обслуговування

[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, ви використовуєте ці ключі реєстру:

Ключ реєстру версії рамки
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active Setup \ Установлені компоненти \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Версія 
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 \ Версія 
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 Tablet Edition
[2] .NET 2.0 SP1
[3] .NET 2.0 Оригінальний випуск (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 не вказана в реєстрі, навіть якщо вона встановлена.
Клас Меллбурн

37
Людина, хіба ніхто в Microsoft не думав додати перемикач -версія?
гнучу

2
Це жарт. Я не можу повірити, що це так ооооу глупо!
Alex Byrth

17

Офіційний відповідь Microsoft на це запитання міститься в наступній статті бази знань:

Ідентифікатор статті: 318785 - Останній огляд: 7 листопада 2008 р. - Редакція: 20.1 Як визначити, які версії .NET Framework встановлені та чи застосовуються пакети послуг

На жаль, це не працює, тому що версія mscorlib.dll у каталозі 2.0 має версію 2.0, а в каталогах 3.0 чи 3.5 не існує версії mscorlib.dll, хоча встановлено 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 .

Знімок цього інструменту із різними версіями .NET:

Знімок цього інструменту із різними версіями .NET


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"
navdu1ast

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.


5

Доступний інструмент GUI - детектор версій ASoft .NET , який завжди виявився високонадійним. Він може створювати XML-файли, вказуючи ім'я файлу виводу XML у командному рядку.

Ви можете використовувати це для автоматизації. Це крихітна програма, написана мовою, що не залежить від мережі .NET, і не потребує встановлення.


4

Мені потрібно було з’ясувати, яку саме версію .NET Framework я мав на своєму комп’ютері, і все, що я робив, - це перейти до панелі управління та вибрати варіант «Видалити програму». Після цього я сортував програми за назвою та знайшов Microsoft .NET Framework 4 Profile Client.


1
Дякую - кожне інше «рішення», яке я спробував, було хибним і не вийшло. Це зробили.
користувач20493

Причиною того, що я прийшов шукати цю інформацію, було те, що матеріали під видаленням програми є абсолютно ненадійними, принаймні, якщо мова йде про .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.


2

Використовуючи бібліотеку Signum.Utilities від SignumFramework (яку ви можете використовувати окремо), ви можете отримати її красиво і не маючи справи з реєстром самостійно:

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

2
Дивлячись на код цього методу, він не дуже повний, наскільки використовуються ключі реєстру, і він повністю пропустить .NET 1.0 і не розрізняє .NET 2.0 (RTM) і .NET 2.0 SP1. Він також не враховує залежності між рамковими версіями.
Скотт Дорман

2
Не вдале рішення. Немає вагомих причин завантажувати всю бібліотеку лише для того, щоб отримати версію .NET, коли ви можете виконати ту саму роботу приблизно в 3 рядки коду. Як програміст, Ви повинні ВЗАЄМО «впоратися з реєстром самостійно».
TheSmurf

3
@DannySmurf Я не згоден. Коли .NET 3.0 був представлений, MS повинен був завернути це у API .NET (як тільки у нас був один рівень 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 для того ж.


1
Запуск цього рядка cmdдає мені ERROR: Description = Invalid namespace.
ПАМ'ЯТ

Я також отримуюERROR: Description = Invalid namespace
Пітер

Ця команда дає мені помилку! (виконується з терміналу Windows 7)
Смріта

Дякую MEMark, Пітер, Smrita за повідомлення.
Mayank Agarwal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.