Определить версию целевого фреймворка во время компиляции

У меня есть некоторый код, который использует методы расширения, но компилируется в .NET 2.0 с использованием компилятора в VS2008. Чтобы облегчить это, я должен был объявить ExtensionAttribute:

/// <summary>
/// ExtensionAttribute is required to define extension methods under .NET 2.0
/// </summary>
public sealed class ExtensionAttribute : Attribute
{
}

Однако теперь я хотел бы, чтобы библиотека, в которой содержится этот класс, была также компилируемой в .NET 3.0, 3.5 и 4.0 - без 'ExtensionAttribute определен в нескольких местах 'предупреждение.

Есть ли какая-либо директива времени компиляции, которую я могу использовать, чтобы включить ExtensionAttribute, только когда целевая версия платформы - .NET 2?

57
задан denfromufa 28 February 2018 в 23:26
поделиться

1 ответ

Связанный вопрос SO с "созданием N различных конфигураций", конечно, один из вариантов, но когда у меня была необходимость в этом, я просто добавил условные элементы DefineConstants, так что в моем Debug|x86 (например) после существующих DefineConstants для DEBUG;TRACE я добавил эти 2, проверяющие значение в TFV, которое было установлено в первой PropertyGroup файла csproj.

<DefineConstants Condition=" '$(TargetFrameworkVersion)' == 'v4.0' ">RUNNING_ON_4</DefineConstants>
<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>

Вам не нужны оба, конечно, но это просто для примера поведения eq и ne - #else и #elif тоже отлично работают :)

class Program
{
    static void Main(string[] args)
    {
#if RUNNING_ON_4
        Console.WriteLine("RUNNING_ON_4 was set");
#endif
#if NOT_RUNNING_ON_4
        Console.WriteLine("NOT_RUNNING_ON_4 was set");
#endif
    }
}

Затем я мог переключаться между таргетингом 3.5 и 4.0, и он делал все правильно.

60
ответ дан 24 November 2019 в 19:26
поделиться