Как определить, какие версии .NET Framework и пакеты обновления установлены? - PullRequest
286 голосов
/ 14 октября 2008

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

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

Ответы [ 13 ]

363 голосов
/ 14 октября 2008

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

17 голосов
/ 21 июня 2010

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

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

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

16 голосов
/ 16 марта 2010

Бета-версия 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);
            }
        }
    }
}
8 голосов
/ 14 октября 2008

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

6 голосов
/ 27 апреля 2015

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

Снимок этого инструмента с различными версиями .NET:

Snapshot of this tool showing different .NET versions

5 голосов
/ 13 декабря 2013

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

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

5 голосов
/ 12 декабря 2013

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

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

5 голосов
/ 11 мая 2010

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

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
4 голосов
/ 20 апреля 2012

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

3 голосов
/ 13 января 2016

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

...