Как проверить, установлен ли .Net?

Один из наших читателей задал этот вопрос. И я решил сегодня написать ответ в блог.

Net Framework Setup

Наиболее надежный способ узнать, установлен ли .NET – проверить присутствие определенного ключа в реестре Windows. Эти ключи располагаются в “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP”. В этом ключе находятся ключи, соответствующие версиям .NET

Для примера, я покажу, как проверить наличие .NET 4.0 Client profile RTM. Для этого нужно открыть ключ \v4\Client и проверить, что значение “Install” содержит 1, а значение Version начинается с “4.0.30319” (для выполнения этой задачи я буду использовать класс Microsoft.Win32.Registry):

// ключ без HKLM
var keyName = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client";

var key = Registry.LocalMachine.OpenSubKey(keyName);
// если ключа нет, тут будет null – значит фреймворк не установлен
if (key != null)
{
   var version = (string) key.GetValue("Version");
   var installed = (int) key.GetValue("Install");

   // проверяем значения
   if (version.StartsWith("4.0.30319") && installed == 1)
   {
       // .NET 4.0 Client profile установлен
   }

   Console.WriteLine("Version: {0}, Installed: {1}", version, installed == 1 ? "Да" : "Нет");
}

Аналогичным образом можно проверить другие версии .NET, но используя другой ключ:

1) .NET 4.0 Full – SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
2) .NET 3.5 – SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5
3) .NET 3.0 – SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0
4) .NET 2.0 – SOFTWARE\Microsoft\NET Framework Setup\NDP\2.0.50727

Обратите внимание, что только у четвертой версии можно проверить отдельно Client Profile и Full установки.

Кроме того, как мы знаем, к версиям .NET поставляются пакеты обновлений (Service Packs). Если вы хотите, чтобы ваше приложение работало с версией .NET независимо от установленных пакетов обновлений – не проверяйте номер версии, только значение “Install”.

Можно также проверить номер установленного пакета. Значение SP того же ключа содержит номер пакета обновления. Если “SP” отсутствует или равно 0, значит это RTM версия .NET

P.S.: Понравилось? Расскажи друзьям!

Комментарии (11)

  • By Gerz, 09.09.2011 @ 14:29

    А смысл? Зачем проверять если программа не запустится без фреймворка. Или зачем проверять из программы на NET 2.0 установлен ли NET 4.0

  • By Хахилев, 09.09.2011 @ 16:22

    Gerz,

    Смысла проверять из программы .NET 2.0, есть ли .NET 2.0 – нет никакого. Программа уже запустилась.

    Но это можно использовать, например, при определении наличия 4.0Full из программы 4.0ClientProfile, если у Вас динамически подключаются библиотеки, использующие 4.0Full (System.Web, например).

    Так же можно это применять в коде инсталляторов, если они не на .NET.

    Наконец, можно делать такую проверку в процедурах автообновления перед загрузкой новой версии программы (использующей новый фреймворк).

    Наверное, найдутся еще какие-то применения, если люди это спрашивают.

  • By adamo86, 09.09.2011 @ 20:46

    Я считаю, что необходимость проверки версии .NET в любом случаи есть. А ценность данной статьи, я считаю в том, что здесь показано как работать с реестром. Лично я еще не ковырялся с реестром на C#.
    Спасибо!

  • By Вячеслав, 10.09.2011 @ 05:38

    Недавно у меня был такой случай. Скачал с Softkey.ru trial-версию одной недорогой программы. Её инсталлятор сразу же заявил, что необходимо сначала установить .NET Framework 2.0. Я точно знал, что эта платформа у меня уже есть. Посмотрел через «Установку и удаление программ», оказалось, у меня версия 2.0 Service Pack 2.
    Разумеется, я не стал делать даундейт фреймворка ради пробной версии одной маленькой программы и отказался от её установки.
    А тут прочитал данную статью и всплыл вопрос: почему в том случае не сработал принцип совместимости «снизу-вверх»? Это недоработка платформы 2.0? Или просто автор той программы включил в свой код лишнюю проверку (значение «Version»)?

  • By Gerz, 10.09.2011 @ 09:02

    Большое спасибо за ответ. Понял.

  • By Хахилев, 10.09.2011 @ 17:33

    Вячеслав, не думаю, что автор сам делал проверку (хотя, конечно, это я не исключаю, но это маловероятно). Возможно, это глюк конфигурации машины, на которую Вы ставили программу. Можно попробовать переставить фреймворк.

  • By Павел, 11.09.2011 @ 16:06

    Позновательно, спасибо! :)
    Gerz в чем то прав, не всегда интересно проверять установлен ли Framework средствами самого же Framework, для таких частных случаем приходится использовать загрузчики, так называемые Bootstrapper, которые написаны на языках не использующих .NET, например, С++. При запуске загрузчик проверяет в системе наличие необходимого для работы .NET Framework, в случае если .NET Framework не установлен, то сообщает об этом, в противном же случае запускает приложение, написанное с использованием платформы .NET.
    Вячеслав также рассказал еще об одном случае проверки установлен ли .NET Framework – это в процессе установки инсталляционного пакета. В setup, создаваемый средствами Visual Studio (и не только), можно включить возможность проверки наличия установленнго в системе .NET Framework, а в случаи его отсутствия и установить его.
    Об остальных случаях Владимир рассказал.

  • By witalik, 03.02.2012 @ 19:47

    Все очень просто. Создаете форму с минимумом подключенных библиотек и в ней проверяете наличие фрейворка. Если есть, пускаете дальше, если нет то предлагаете поставить.

  • By Виктор, 01.03.2012 @ 13:52

    Этот код годится только для проверки наличия определённой версии .NET Framework, а для проверки наличия самого .NET Framework не годится, т.к. использует его!

  • By inkognito, 30.05.2012 @ 23:40

    У меня используется такой случай:
    запускается прогарммка и проверяет: если установлен 2.0, тогда запускает приложение написанное под Windows Forms, иначе запускает приложение, написанное на фреймверке 3.5 (тоже самое приложение, только с эффектами WPF). Пользователям с предустановленной Вистой-Семеркой эффекты подавай :)

  • By Кирилл, 01.06.2012 @ 10:50

    Хотелось бы увидеть надежный способ проверки наличия FW4 на компьютере. Например у меня в Windows 7 Profesional такого ключа вообще нет:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
    есть HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework\v….
    у товарища HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework\NDP\v…
    Кто его знает сколько еще есть вариантов записи в реестр информации о FW по этому приведенный вами способ работать не будет.

Оставить комментарий

Следи за нами на Twitter