Сведения о вопросе

Mathprofi

00:22, 13th August, 2020

Теги

.net   .net-3.5   installer   registry    

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

Просмотров: 452   Ответов: 9

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

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

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

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



  Сведения об ответе

VERSUION

18:39, 16th August, 2020

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

System.Web.Extensions

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

Это может быть один из тех случаев, когда вы спрашиваете себя "What am I trying to accomplish?" и смотрите, есть ли альтернативные маршруты.


  Сведения об ответе

lourence

10:24, 1st August, 2020

Вы могли бы попробовать:

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

@ Nick : хороший вопрос, я попробую его немного позже.

Килоэлектронвольт


  Сведения об ответе

piter

23:13, 5th August, 2020

  Сведения об ответе

qwerty101

05:46, 13th August, 2020

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

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

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

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


  Сведения об ответе

PIRLO

09:46, 28th August, 2020

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

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

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


  Сведения об ответе

DINO

22:08, 27th August, 2020

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

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

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


  Сведения об ответе

+-*/

18:57, 7th August, 2020

@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 рамок 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; Зуне 2.5).


  Сведения об ответе

COOL

04:25, 7th August, 2020

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

C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5

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


  Сведения об ответе

park

03:58, 4th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться