Search code examples
c#.netvisual-studiomsbuildextension-methods

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?


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)
        {
    #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
        }
    }
    

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