Необходимо провести четкое различие между CLR (т. Е. «Средой выполнения») и библиотеками фреймворка (т. Е. «Фреймворком»).Вы выполняете свой код с первым или с первым, ваш код компилируется и использует позднее.К сожалению, при использовании термина «.NET версия » обычно подразумевается целый пакет как среды выполнения, так и фреймворка, независимо от их отдельных версий, которые, как уже было сказано, могут различаться.
Вы можете обнаружить версии установленных фреймворков .Это, однако, не говорит вам, какой из них вы фактически используете во время выполнения.
Я не уверен насчет 4,5, но с 2,0 против 3,0 или 3,5 Environment.Version
не помогло, поскольку оно всегдавернул 2.0, так как все эти версии фреймворка использовали CLR 2.0.Я предполагаю , что с framework 4.5 версия CLR по-прежнему равна 4.0, что объясняет, что Environment.Version
возвращает 4.0.x даже в этом случае.
Техникадля вас может подойти проверка типа, метода или свойства в основных библиотеках (mscorlib, System.Core и т. д.), которые, как вы знаете, существуют, только начиная с конкретной версии .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) и более (вместе именуемые «каркас»), а также саму среду выполнения, то есть CLR, обе из которых могут иметь разные версии, как уже было сказано.
Я не работаю на Microsoft и не понимаю реальных причин отсутствия (единой) функции или API для получения «версии .NET Framework», но я могу сделать обоснованное предположение.
Не ясно, какую информацию, в частности, должна предоставлять такая функция / API. Даже отдельные сборки BCL не имеют общего (сборка / файл).) версия.Например, в .NET 3.0 и 3.5 mscorlib.dll имел версию 2.0.x, в то время как только в новых сборках WCF и WF было 3.0.Я думаю даже с .NET 3.5 у System.ServiceModel.dll
все еще была версия 3.0.x.Что я пытаюсь сказать, нет единой версии на всех сборках фреймворка.Так что же должен вызывать вызов API, скажем, System.Environment.FrameworkVersion
?Какое значение будет иметь версия (даже если она вернет «символическую» версию, такую как 4.5, она не будет иметь большого значения, не так ли?).
Слишкомспецифичные Некоторые новые функции могут появиться в SP к существующим версиям, а также стать частью новой версии.При проверке функций ваше приложение может отлично работать на предыдущих версиях, которые были обновлены, в то время как при явной проверке версии оно может излишне ограничиться самой новой версией.У меня нет примера из мира .NET для этого, но в целом (и в самой Windows, например, WMI) это может и произошло.
Не хотел. Я мог бы себе представить, что метод для определения "версии фреймворка", который в настоящее время используется приложением, даже не желательный для них предоставлять. Существует длинная и безобразная история ошибок проверки версий (см. Параграф «Не проверять версию» для понятий, которые также применимы к .NET), в родном мире / Win32. Например, люди неправильно использовали API GetVersion
и GetVersionEx
, проверяя только то, что они запускают версию, которая, как они знали, была самой новой, когда они писали свое приложение. Таким образом, когда приложение запускалось в более новой версии Windows, оно не запускалось, даже несмотря на то, что функции , которые они действительно использовали, все еще были там. Microsoft могла бы рассмотреть подобные проблемы и, следовательно, даже не предоставила некоторый API в .NET.
Кстати, именно это Microsoft рекомендует в разделе замечаний функции GetVersion:
Идентификация текущей операционной системы обычно не лучший способ
определить, присутствует ли конкретная функция операционной системы.
Это связано с тем, что в операционной системе могут быть добавлены новые функции
в распространяемой DLL. Вместо использования GetVersionEx для определения
платформа операционной системы или номер версии, проверьте наличие
самой функции.
Блог команды Windows также может что-то сказать .
Я знаю, что все это касалось Windows и собственного программирования, но концепция и опасности одинаковы для приложений .NET, среды и CLR.
Я бы сказал, что проверка функций с (изящным) резервом, таким образом, является гораздо более надежным и надежным способом проверки совместимости вашего приложения. Если вы хотите, чтобы ваше приложение работало только с определенной версией .NET или новее, не делайте ничего особенного и рассчитывайте на обратную совместимость самого .NET.