Лучший способ определить, установлен ли .NET 3.5 - PullRequest
15 голосов
/ 19 августа 2008

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

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

Что возвращает "2.0.50727.1434", так что не повезло ...

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

Ответы [ 9 ]

3 голосов
/ 19 августа 2008

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

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

3 голосов
/ 19 августа 2008

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

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

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

Кев

3 голосов
/ 19 августа 2008

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

System.Web.Extensions

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

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

2 голосов
/ 19 августа 2008

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

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

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

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

1 голос
/ 23 октября 2009

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

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

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

1 голос
/ 30 июня 2009

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

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

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

1 голос
/ 19 августа 2008

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

C: \ Program Files \ Ссылка Сборки \ Microsoft \ Framework \ v3.5

Можно подумать, что Microsoft встроит проверку для "последней версии" в фреймворк.

1 голос
/ 19 августа 2008

@ 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; .СЕТЬ CLR 3.5.21022; Zune 2.5).

0 голосов
/ 29 августа 2008

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

...