c#

位置:IT落伍者 >> c# >> 浏览文章

针对不同.NET版本的条件编译


发布日期:2021年06月22日
 
针对不同.NET版本的条件编译

为了在NET 下能够编译成功我写了一个文件 Patchcs定义了SystemRuntimeCompilerServicesExtensionAttribute类型这样就可以在下使用lambda表达式和扩展方法了同时添加了几个用到的SystemCoredll引入的Action类型

namespace SystemRuntimeCompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<TT>(T tT t

}

然而要在NET 下编译因为类型已经存在必须注释掉Patchcs很麻烦于是想通过条件编译来解决

#if NET

namespace SystemRuntimeCompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<TT>(T tT t

}

#endif

问题是net 里没有定义和net版本有关的指示符怎么办呢?自己动手丰衣足食使用Build Events在编译之前自动侦测出项目所使用的net版本定义出我们想要的指示符

在 C#模板编程( 编写C#预处理器让模板来的再自然一点一文中写了一个程序 Csmacroexe 来实现C#下的模板机制本文在Csmacroexe 的基础上增加侦测项目所引用的net 版本的功能

原理查找项目目录下的 csproj 文件解析它找到节点TargetFrameworkVersion判断net版本然后生成一个Csmacro_Templatecs文件在里面 #define 版本指示符例如Net 项目生成的 Csmacro_Templatecs 文件内容为

#define NET

修改后Csmacro的代码可在https://githubcom/xiaotie/GebCommon上下载(目前只处理了 net 如需要针对其它版本可自行修改代码)有了 Csmacro一切就好办了

第一步把 Csmacroexe 放在Path路径下

第二步打开需要条件编译的项目添加 Prebuild 事件Csmacroexe $(ProjectDir)

第三步编辑源文件Patchcs 文件修改为

#region include Csmacro_Templatecs

#endregion

#if NET

namespace SystemRuntimeCompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<TT>(T tT t

}

#endif

#region include 是我引入的 Csmacro 宏语法详见 C#模板编程( 编写C#预处理器让模板来的再自然一点 一文点击编译系统会生成一个 Patch_Csmacrocs 文件内容如下

#define NET

#if NET

namespace SystemRuntimeCompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<TT>(T tT t

}

#endif

第四步把生成的 Patch_Csmacrocs 添加到项目中来

搞定以后选择不同的target编译时产生的就是对该target的条件编译!

上一篇:用C#编写发手机中文短信息Windows服务

下一篇:如何查找.NET程序内存不断上涨的原因[2]