Лучший способ определить, установлен ли .NET 3.5

Мне нужно программно определить, установлен ли .NET 3.5. Я думал, что это будет легко

<% Response.Write(Environment.Version.ToString()); %>

Который возвращает "2.0.50727.1434", так что нет такой удачи ...

В моем исследовании я обнаружил, что есть некоторые довольно неясные ключи реестра, на которые я могу взглянуть, но я не уверен, что это путь. У кого-нибудь есть предложения?

19.08.2008 13:45:03
9 ОТВЕТОВ
РЕШЕНИЕ

Вы можете попробовать:

static bool HasNet35()
{
    try
    {
        AppDomain.CurrentDomain.Load(
            "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
        return true;
    }
    catch
    {
        return false;
    }
}

@ Ник : Хороший вопрос, я попробую это немного.

Кев

3
23.05.2017 11:45:49
Допустим, на следующей неделе Microsoft выпустит версию 4.0 и сделает все, что сделал 3.5, плюс еще немного. Будет ли это все еще работать? Кажется, что это зависит от установки 3.5, но сломается на машине, где установлена ​​более новая версия без установки 3.5.
Jared 3.01.2009 14:55:20
@ Джаред - я полностью согласен. Обнаружение версии фреймворка кажется довольно грязным.
Kev 5.01.2009 19:02:24
@ Джаред - и, следовательно, это просто предложение, а не окончательный ответ.
Kev 5.01.2009 19:02:56
Раньше я проверял конкретную сборку в начале выполнения программы, но это только вызывало проблемы. Во-первых, если пользователь даже не установил .net, он не сможет запустить ваше приложение. Во-вторых, если у них нет нужной вам версии, вы вынуждены написать собственный код, чтобы либо загрузить его, либо перенаправить их куда-нибудь, чтобы загрузить. Эта проверка вызвала сбои на определенных машинах, и с тех пор я выпустил новую версию программного обеспечения, которая удалила эту проверку. Смотрите мой ответ ниже для лучшего решения.
Jared 30.06.2009 00:34:43

Это потому, что технически .NET 3.5 является расширением платформы 2.0. Самый быстрый способ - включить сборку из .NET 3.5 и посмотреть, не сломается ли она.

System.Web.Extensions

Это хорошая сборка, которая входит только в версию 3.5. Также кажется, что вы используете ASP.NET для запуска этой проверки, это действительно ограничивает вас, потому что вы не сможете проверить файловую систему или реестр, работающий в защищенном режиме ASP.NET. Или вы всегда можете попытаться загрузить сборку из GAC, которая должна быть только в .NET 3.5, однако вы можете снова столкнуться с проблемами с разрешениями.

Это может быть один из тех случаев, когда вы спрашиваете себя "Чего я пытаюсь достичь?" и посмотреть, есть ли альтернативные маршруты.

3
19.08.2008 13:50:43
Разве System.Web.Extensions не является частью ASP.NET AJAX с версией 1.0.something?
Michael Stum♦ 12.08.2009 12:53:13
@ Майкл, да. Это 1.0.61231.0
AndyMcKenna 15.10.2009 17:50:02

@komradekatz, ваше решение ниже от MSDN для удобства других пользователей, которые занимаются этим. Мне не нравится это решение, потому что оно использует пользовательский агент для определения версии. Это не подходит для того, что мне нужно (я пишу библиотеку классов, которая должна знать, установлен ли .NET 3.5). Я также сомневаюсь, насколько надежным может оказаться это решение.

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<HTML>
  <HEAD>
    <TITLE>Test for the .NET Framework 3.5</TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" />
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var dotNETRuntimeVersion = "3.5.0.0";

    function window::onload()
    {
      if (HasRuntimeVersion(dotNETRuntimeVersion))
      {
        result.innerText = 
          "This machine has the correct version of the .NET Framework 3.5."
      } 
      else
      {
        result.innerText = 
          "This machine does not have the correct version of the .NET Framework 3.5." +
          " The required version is v" + dotNETRuntimeVersion + ".";
      }
      result.innerText += "\n\nThis machine's userAgent string is: " + 
        navigator.userAgent + ".";
    }

    //
    // Retrieve the version from the user agent string and 
    // compare with the specified version.
    //
    function HasRuntimeVersion(versionToCheck)
    {
      var userAgentString = 
        navigator.userAgent.match(/.NET CLR [0-9.]+/g);

      if (userAgentString != null)
      {
        var i;

        for (i = 0; i < userAgentString.length; ++i)
        {
          if (CompareVersions(GetVersion(versionToCheck), 
            GetVersion(userAgentString[i])) <= 0)
            return true;
        }
      }

      return false;
    }

    //
    // Extract the numeric part of the version string.
    //
    function GetVersion(versionString)
    {
      var numericString = 
        versionString.match(/([0-9]+)\.([0-9]+)\.([0-9]+)/i);
      return numericString.slice(1);
    }

    //
    // Compare the 2 version strings by converting them to numeric format.
    //
    function CompareVersions(version1, version2)
    {
      for (i = 0; i < version1.length; ++i)
      {
        var number1 = new Number(version1[i]);
        var number2 = new Number(version2[i]);

        if (number1 < number2)
          return -1;

        if (number1 > number2)
          return 1;
      }

      return 0;
    }

    -->
    </SCRIPT>
  </HEAD>

  <BODY>
    <div id="result" />
  </BODY>
</HTML>

На моей машине это выводит:

На этом компьютере установлена ​​правильная версия .NET Framework 3.5.

Строка userAgent этого компьютера: Mozilla / 4.0 (совместима; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.5 .21022; Zune 2.5).

1
19.08.2008 13:58:14

@Kev, очень нравится твое решение. Спасибо за помощь.

При использовании реестра код будет выглядеть примерно так:

RegistryKey key = Registry
        .LocalMachine
        .OpenSubKey("Software\\Microsoft\\NET Framework Setup\\NDP\\v3.5");
return (key != null);

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

2
19.08.2008 14:42:47

Хороший ресурс, который я нашел:

http://www.walkernews.net/2008/05/16/how-to-check-net-framework-version-installed/

3
19.08.2008 14:53:06

Еще одна интересная находка - наличие сборок здесь:

C: \ Program Files \ Справочные сборки \ Microsoft \ Framework \ v3.5

Вы могли бы подумать, что Microsoft встроит проверку для «последней версии» в структуру.

1
19.08.2008 14:52:48

Без каких-либо загрузок сборки и перехвата исключений (что происходит медленно) проверьте наличие изменений API класса между 2.0 и 3.5. Статус Mono Class очень полезен для этого. Например, вы можете проверить, GC.Collect Method (Int32, GCCollectionMode)что находится в mscorlib и был добавлен в 3.5.

0
29.08.2008 04:55:47

Если вы хотите, чтобы определенная версия .net была установлена ​​и могла контролировать распространение вашего приложения, вам действительно следует использовать ClickOnce . Он позволяет вам указать минимально требуемую версию .Net Framework, которая должна быть установлена, и будет проверять только то, когда она устанавливается, чтобы все последующие запуски не мешали ненужной проверке.

Кроме того, с ClickOnce вы получаете обновление бесплатно. Почему кто-то не хочет использовать это?

Чтобы настроить приложение ClickOnce, просто щелкните правой кнопкой мыши проект в Visual Studio и перейдите в Параметры публикации. Это создаст специальную сборку вашего приложения, которую вы можете разместить на своем сайте. Когда пользователи загружают программу, установщик проверит наличие любых предварительных условий, таких как .Net, для вас.

1
30.06.2009 00:39:41
Все очень хорошо, но на самом деле не отвечает на вопрос ОП. Существуют сценарии (с которыми ОП явно сталкивался), где вам нужно программно определить версию установленного фреймворка.
Kev 30.06.2009 00:54:48
@Kev, ты прав. Еще раз посмотрев на вопрос, я вижу, что он ищет проверить, установлен ли он, и не требует, чтобы он был установлен. Я оставлю здесь свой ответ в надежде, что любой, кто неправильно прочитает ОП, найдет ответ, который искал.
Jared 4.07.2009 03:16:50

Одним из вариантов является обнаружение 4.0 с использованием строки версии:

    Environment.Version.CompareTo(new Version(4, 0));

затем, поскольку версии 2.0 и 2.5 имеют общий номер версии CLR, их необходимо устранить, проверив реестр. Поскольку эти версии уже выпущены, строки для поиска известны.

1
23.10.2009 13:30:05