У меня есть несколько предложений по улучшению ответов, данных на данный момент:
Использовать Version.CompareTo ().Тестирование на равенство не будет работать для более поздних версий фреймворка, которые пока не названы.Например,
<CustomConstants Condition=" '$(TargetFrameworkVersion)' == 'v4.0' ">
не будет соответствовать v4.5 или v4.5.1, что обычно требуется.
Используйте файл импорта, чтобы эти дополнительные свойства требовали толькобыть определенным один раз.Я рекомендую держать файл импорта под контролем исходного кода, чтобы изменения распространялись вместе с файлами проекта без лишних усилий.
Добавьте элемент импорта в конец файла проекта, чтобычто он не зависит от конфигурационных групп свойств.Это также имеет то преимущество, что в файле проекта требуется одна дополнительная строка.
Вот файл импорта (VersionSpecificSymbols.Common.prop)
<!--
******************************************************************
Defines the Compile time symbols Microsoft forgot
Modelled from https://msdn.microsoft.com/en-us/library/ms171464.aspx
*********************************************************************
-->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DefineConstants Condition="$([System.Version]::Parse('$(TargetFrameworkVersion.Substring(1))').CompareTo($([System.Version]::Parse('4.5.1')))) >= 0">$(DefineConstants);NETFX_451</DefineConstants>
<DefineConstants Condition="$([System.Version]::Parse('$(TargetFrameworkVersion.Substring(1))').CompareTo($([System.Version]::Parse('4.5')))) >= 0">$(DefineConstants);NETFX_45</DefineConstants>
<DefineConstants Condition="$([System.Version]::Parse('$(TargetFrameworkVersion.Substring(1))').CompareTo($([System.Version]::Parse('4.0')))) >= 0">$(DefineConstants);NETFX_40</DefineConstants>
<DefineConstants Condition="$([System.Version]::Parse('$(TargetFrameworkVersion.Substring(1))').CompareTo($([System.Version]::Parse('3.5')))) >= 0">$(DefineConstants);NETFX_35</DefineConstants>
<DefineConstants Condition="$([System.Version]::Parse('$(TargetFrameworkVersion.Substring(1))').CompareTo($([System.Version]::Parse('3.0')))) >= 0">$(DefineConstants);NETFX_30</DefineConstants>
</PropertyGroup>
</Project>
ДобавитьИмпорт элемента в файл проекта
Ссылка на него из файла .csproj путем добавления в конце перед тегом.
…
<Import Project="VersionSpecificSymbols.Common.prop" />
</Project>
Вам необходимо исправить путь, чтобы указать на общийПапка / shared, в которую вы помещаете этот файл.
Использование символов времени компиляции
namespace VersionSpecificCodeHowTo
{
using System;
internal class Program
{
private static void Main(string[] args)
{
#if NETFX_451
Console.WriteLine("NET_451 was set");
#endif
#if NETFX_45
Console.WriteLine("NET_45 was set");
#endif
#if NETFX_40
Console.WriteLine("NET_40 was set");
#endif
#if NETFX_35
Console.WriteLine("NETFX_35 was set");
#endif
#if NETFX_30
Console.WriteLine("NETFX_30 was set");
#endif
#if NETFX_20
Console.WriteLine("NETFX_20 was set");
#else
The Version specific symbols were not set correctly!
#endif
#if DEBUG
Console.WriteLine("DEBUG was set");
#endif
#if MySymbol
Console.WriteLine("MySymbol was set");
#endif
Console.ReadKey();
}
}
}
Общий пример из реальной жизни
Реализация соединения (разделитель строк, строки IEnumerable) До .NET 4.0
// string Join(this IEnumerable<string> strings, string delimiter)
// was not introduced until 4.0. So provide our own.
#if ! NETFX_40 && NETFX_35
public static string Join( string delimiter, IEnumerable<string> strings)
{
return string.Join(delimiter, strings.ToArray());
}
#endif
Ссылки
Функции свойств
Оценка свойства MSBuild
Можно ли сделать директиву препроцессора зависимой от версии платформы .NET?
Условная компиляция в зависимости от версии платформы в C #