Как я могу обнаружить во время выполнения that.NET версия 4.5 В настоящее время работает ваш код?


Я установил .NET 4.5 Developer preview из http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27541, который "заменяет" версию .NET 4.0.

однако старый способ обнаружения версии .NET framework, похоже, возвращает 4.0 (точнее 4.0.30319.17020 на моем ПК), а не 4.5 (конечно, вероятно, для обратной совместимости или?):

using System;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var version = Environment.Version;
            Console.WriteLine(version.ToString());
            Console.ReadKey();
        }
    }
}

Как я могу определить, что мой код действительно выполняется .NET 4.5?

6 58

6 ответов:

вы должны сделать четкое различие между CLR (т. е. "runtime") и библиотеками фреймворков (т. е. "framework"). Вы выполняете свой код на или с первым, ваш код компилируется и использует более поздний. К сожалению, при использовании термина " .NET версия " обычно имеется в виду весь пакет как среды выполнения, так и фреймворка, независимо от их отдельных версий, которые, как уже было сказано, могут отличаться.

вы можете обнаружить установлен Framework версии. Это, однако, не говорит вам, какой из них вы на самом деле используете во время выполнения.

Я не уверен насчет 4.5, но с 2.0 и 3.0 или 3.5 Environment.Version не помогло, так как он всегда возвращал 2.0, поскольку все эти версии фреймворка использовали CLR 2.0. Я предполагаю, что с рамки 4.5 версия CLR по-прежнему 4.0, что объясняет это Environment.Version возвращает 4.0.x даже в этом случае.

A метод, который может работать для вас, - это проверка типа, метода или свойства в основных библиотеках (mscorlib, System.Сердечник, etc.) что вы знаете, что существует только начиная с определенной версии .NET framework.

например, ReflectionContext класс кажется совершенно новым с .NET framework 4.5 и удобно живет в mscorlib. Так что вы могли бы сделать что-то подобное.

  public static bool IsNet45OrNewer()
  {
      // Class "ReflectionContext" exists from .NET 4.5 onwards.
      return Type.GetType("System.Reflection.ReflectionContext", false) != null;
  }

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

обновление: обратите внимание, что термин .NET 4.5 относится ко всему пакету из нескольких сборок, которые составляют библиотеки базовых классов (BCL) и более (совместно называемые "framework") плюс сама среда выполнения, т. е. среда CLR - оба из которых могут иметь разные версии, как это было сказал.

Я не работаю в Microsoft и не понимаю реальных причин отсутствия (одной) функции или API для получения "версии .NET framework", но я могу сделать обоснованное предположение.

  1. неясно, какую информацию, в частности, должна предоставлять такая функция/API. даже отдельные сборки BCL не имеют общей версии (сборка / файл). Например, с .NET 3.0 и 3.5, mscorlib.библиотека DLL была версия 2.0.x в то время как только новые сборки WCF и WF имели 3.0 что-то. Я думаю даже с .NET 3.5 the System.ServiceModel.dll еще была версия 3.0.х. Что я пытаюсь сказать, нет единой версии на все сборки каркаса. Итак, что должен вызывать API, скажем,System.Environment.FrameworkVersionвернуться? Какое значение будет иметь версия (даже если она вернет "символическую" версию, например 4.5, это будет иметь мало значения, не так ли?).

  2. слишком специфичны Некоторые новые функции могут поступать в SPs в существующие версии, а также быть частью новой версии. Выполняя проверку функций, ваше приложение может отлично работать на версии, которые были обновлены, в то время как с явной проверкой версии это могло бы излишне ограничиться самой новой версией. У меня нет примера из мира .NET для этого, но в целом (и в самой Windows, например, WMI) это может и произошло.

  3. не желаемый. я мог бы себе представить, что метод для определения "версии фреймворка", который в настоящее время используется приложением, даже не желательно для них, чтобы обеспечить. Существует долгая и нечестивая история проверка версий ошибок (см. пункт" не проверять версию " для понятий, которые также применяются к .NET), в собственном мире/Win32. Например, люди использовали GetVersion и GetVersionEx API неправильно, только проверяя, что они запускают версию, которую они знал, что был самым Новым, когда они написали свое заявление. Таким образом, когда приложение было запущено на более новой версии windows, он не будет работать, даже если особенности они действительно были все еще там. Microsoft, возможно, рассматривала такие проблемы и, следовательно, даже не предоставляла некоторые API в. NET.

кстати, это то, что Microsoft рекомендует в разделе Примечания функции GetVersion:

идентификация текущей операционной системы обычно не лучший способ чтобы определить, присутствует ли определенная функция операционной системы. Это потому, что операционная система, возможно, были добавлены новые функции в распространяемых файлов. Вместо того, чтобы использовать GetVersionEx для определения платформа операционной системы или номер версии, проверка на наличие самой функции.

в блоге команды Windows также есть что-то сказать о этот.

Я знаю, что все это было о Windows и родном программировании, но концепция и опасности одинаковы для приложений .NET framework и CLR.

Я бы сказал, что функция проверки с (изящным) резервным вариантом, таким образом, является гораздо более надежным и надежным способом убедиться, что ваше приложение совместимо с нижним уровнем. Если вы хотите, чтобы ваше приложение работало только с определенной версией .NET или новее, не делайте ничего особенного и рассчитывайте на обратное совместимость .Чистая сама по себе.

.NET Framework 4.5-это обновление на месте до версии 4.0. Это свободно означает, что если вы работаете в версии 4.0 или 4.5 runtime, и 4.5 установлен, то вы, безусловно, работает на 4.5. Ваш чек может пойти следующим образом.

давайте вызовем оба времени выполнения 4.0 и 4.5 4.0 версий среды выполнения.

  1. Проверьте, работаете ли вы в среде выполнения 4.0-versioned:

    • если ваша сборка скомпилирован для целевого .NET 4.0 или
    • Environment.Version.Major == 4 && Environment.Version.Minor == 0

    тогда вы работаете в среде выполнения 4.0-versioned.

  2. проверьте, является ли ваша среда выполнения 4.0-versioned на самом деле версией 4.0 или 4.5, проверив установленную версию:

    • под ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client, Регистрация _Version_ значение. Если он начинается с "4.0" вы работаете в среде выполнения 4.0, если он начинается с "4.5" вы работаете на 4.5 во время выполнения.

чтобы точно определить, какой патч .NET работает ваше приложение, выполните этот вызов, чтобы найти номер сборки mscorlib:

System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion

в настоящее время он возвращает 4.6.1055.0 для меня, что соответствует .NET 4.6.1.

вы можете проверить, является ли.NET Framework 4.5 или .NET Framework 4 устанавливается путем проверки HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full подраздел в реестре за DWORD значение имени Release. Существование этого DWORD указывает, что.NET Framework 4.5 был установлен на этом компьютере. Значение Release - номер версии. Чтобы определить, является ли конечная версия выпуска.NET Framework 4.5 установлен, проверьте значение равно или больше 378389.

Джеймс предлагает отличный ответ!--9--> извлечения "версии продукта" из mscorlib.dll во время работы:

(using System.Diagnostics;)

FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion

это работает хорошо, но вы можете получить более мелкозернистый результат, изучив

из того, что я понял из онлайн-ресурсов, .NET 4.5 будет действовать аналогично (хотя и не полностью то же самое), что и 3.5 для 2.0: ваш номер версии остается тем же (если вы запустите код 3.5, версия CLR будет 2.0), и он будет действовать как обновление существующей среды CLR 4.0.

таким образом, Вы сможете иметь сосуществование 2.0 повышен до 3.5 и 4.0 повышен до 4.5.

Что остается неясным, если это будет возможно сделать (или работать на существующих) проектов в 4.0 без необходимости обновлять их до 4.5: В настоящее время вы можете создавать проекты 2.0 или 3.5 в Visual Studio 2010, но, возможно, это будет не то же самое для 4.0 и 4.5.