Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Кев

Другие советы

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

System.Web.Extensions

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

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

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

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

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

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

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

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

@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 (совместим;МСИЭ 7.0;Windows НТ 6.0;SLCC1;.NET CLR 2.0.50727;.NET CLR 3.0.04506;ИнфоПат.2;.NET CLR 1.1.4322;.NET CLR 3.5.21022;Зун 2.5).

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

C: Program Files RESTERAL ASSEMBLIES Microsoft Framework v3.5

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

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

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

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

Один из вариантов — определить версию 4.0 по строке версии:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top