一尘不染

在编译时检测目标框架版本

c#

我有一些使用扩展方法的代码,但是使用VS2008中的编译器在.NET 2.0下进行编译。为方便起见,我必须声明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”警告。

当目标框架版本为.NET 2时,是否可以使用任何编译时指令来仅包含ExtensionAttribute?


阅读 198

收藏
2020-05-19

共1个答案

一尘不染

与“创建N个不同的配置”相关联的SO问题当然是一个选择,但是当我有此需要时,我只是添加了条件DefineConstants元素,因此在Debug |
x86(例如)中,在DEFUG;
TRACE的现有DefineConstants之后,我添加了这些2,检查csproj文件的第一个PropertyGroup中设置的TFV中的值。

<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之间切换,它将做正确的事。

2020-05-19