编译时检测.NET Framework框架版本


在新的.NET框架下,官方自带了一些用于判断框架版本的条件变量(C#预处理器指令)

但是在老的编译系统上没有此功能,所以只能模拟实现。

终于在 stackoverflow 上找到了答案,思路很不错,在.csproj工程文件中利用框架的System.Version去动态比较版本号,然后定义相关的条件变量。

解决方案

在原答案的基础上修改了一下,兼容了微软官方的条件变量。

创建一个新文件FrameworkSymbols.Common.prop,内容如下


  
    $(DefineConstants);NET48;NET48_OR_GREATER
    $(DefineConstants);NET472;NET472_OR_GREATER
    $(DefineConstants);NET471;NET471_OR_GREATER
    $(DefineConstants);NET47;NET47_OR_GREATER
    $(DefineConstants);NET462;NET462_OR_GREATER
    $(DefineConstants);NET461;NET461_OR_GREATER
    $(DefineConstants);NET46;NET46_OR_GREATER
    $(DefineConstants);NET452;NET452_OR_GREATER
    $(DefineConstants);NET451;NET451_OR_GREATER
    $(DefineConstants);NET45;NET45_OR_GREATER
    $(DefineConstants);NET40;NET40_OR_GREATER
    $(DefineConstants);NET35;NET35_OR_GREATER
    $(DefineConstants);NET30;NET30_OR_GREATER
    $(DefineConstants);NET20;NET20_OR_GREATER
  

在工程文件中导入


    ...
    

使用

#if NET20
    Console.WriteLine("NET20");
#endif
...
#if NET35_OR_GREATER
    Console.WriteLine("NET35_OR_GREATER");
#endif

参考

Detect target framework version at compile time

C#预处理器指令