Как я обнаруживаю, какие версии Платформы.NET и пакеты обновления установлены?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

286
задан Peter Mortensen 21 June 2017 в 21:52
поделиться

6 ответов

Реестр официальный путь , чтобы обнаружить, если определенная версия Платформы установлена.

enter image description here

, Какие ключи реестра необходимы изменение в зависимости от версии Платформы, которую Вы ищете:

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. Снова.NET 1,0 использования строковое значение, в то время как все другие используют DWORD.

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

, В то время как я явно не попросил это, если бы Вы хотите знать точный номер версии Платформы, Вы использовали бы эти ключи реестра:

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 строковое значение в любом из этих ключей имеет формат #,#,####,#. #,#,#### часть строки является версией Платформы.

  • для.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 (версия 4.0 CLR), который может работать бок о бок с CLR 2.0.

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

не будет v4.5, вводят реестр, если.NET 4.5 установлена. Вместо этого необходимо проверить, содержит ли HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full ключ значение, названное Release. Если это значение присутствует.NET 4.5 установлена, иначе это не. Больше деталей может быть найдено здесь и здесь .

363
ответ дан Martin Schneider 23 November 2019 в 01:48
поделиться

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

8
ответ дан Peter Mortensen 23 November 2019 в 01:48
поделиться

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

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
2
ответ дан Peter Mortensen 23 November 2019 в 01:48
поделиться

Бета-версия 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);
            }
        }
    }
}
16
ответ дан 23 November 2019 в 01:48
поделиться

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

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
5
ответ дан 23 November 2019 в 01:48
поделиться

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

Идентификатор статьи: 318785 - Последний обзор: 7 ноября 2008 - Пересмотр: 20.1 How to determine what versions of the .NET Framework are installed and whether service packs were applied

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

17
ответ дан 23 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: