C# – Detect target framework version at compile time


I have some code which makes use of Extension Methods, but compiles under .NET 2.0 using the compiler in VS2008. To facilitate this, I had to declare ExtensionAttribute:

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

However, I'd now like the library in which that class is contained to also be compilable under .NET 3.0, 3.5 and 4.0 – without the 'ExtensionAttribute is defined in multiple places' warning.

Is there any compile time directive I can use to only include the ExtensionAttribute when the framework version being targetted is .NET 2?

Best Solution

The linked SO question with 'create N different configurations' is certainly one option, but when I had a need for this I just added conditional DefineConstants elements, so in my Debug|x86 (for instance) after the existing DefineConstants for DEBUG;TRACE, I added these 2, checking the value in TFV that was set in the first PropertyGroup of the csproj file.

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

You don't need both, obviously, but it's just there to give examples of both eq and ne behavior - #else and #elif work fine too :)

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

I could then switch between targeting 3.5 and 4.0 and it would do the right thing.