针对不同.NET版本的条件编译
为了在 .NET 2.0 下能够编译成功,我写了一个文件 Patch.cs,定义了 System.Runtime.CompilerServices.ExtensionAttribute 类型,这样就可以在2.0下使用lambda表达式和扩展方法了,同时,添加了几个用到的System.Core.dll 引入的Action类型:
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action();
public delegate void Action T0,T1 (T0 t0,T1 t1);
}
然而,要在.NET 4.0 下编译,因为类型已经存在,必须注释掉Patch.cs,很麻烦。于是想通过条件编译来解决,即:
#if NET2
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action();
public delegate void Action T0,T1 (T0 t0,T1 t1);
}
#endif
问题是,.net 里没有定义和.net版本有关的指示符。怎么办呢?自己动手,丰衣足食,使用Build Events在编译之前自动侦测出项目所使用的.net版本,定义出我们想要的指示符。
在 C#模板编程(2): 编写C#预处理器,让模板来的再自然一点一文中,写了一个程序 Csmacro.exe 来实现C#下的模板机制,本文在Csmacro.exe 的基础上,增加侦测项目所引用的.net 版本的功能。
原理:查找项目目录下的 csproj 文件,解析它,找到节点TargetFrameworkVersion,判断.net版本,然后生成一个Csmacro_Template.cs文件,在里面 #define 版本指示符。例如,对 .Net 2.0 项目,生成的 Csmacro_Template.cs 文件内容为:
#define NET2
修改后Csmacro的代码可在:https://github.com/xiaotie/GebCommon上下载(目前只处理了 .net 2.0 和 4.0,如需要针对其它版本,可自行修改代码)。有了 Csmacro,一切就好办了。
第一步,把 Csmacro.exe 放在Path路径下
第二步,打开需要条件编译的项目,添加 Pre-build 事件:Csmacro.exe $(ProjectDir)
第三步,编辑源文件,如,Patch.cs 文件修改为:
#region include Csmacro_Template.cs
#endregion
#if NET2
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action();
public delegate void Action T0,T1 (T0 t0,T1 t1);
}
#endif
#region include 是我引入的 Csmacro 宏语法。详见 C#模板编程(2): 编写C#预处理器,让模板来的再自然一点 一文。点击编译,系统会生成一个 Patch_Csmacro.cs 文件,内容如下:
#define NET2
#if NET2
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action();
public delegate void Action T0,T1 (T0 t0,T1 t1);
}
#endif
第四步,把生成的 Patch_Csmacro.cs 添加到项目中来。
搞定以后,选择不同的target,编译时产生的就是对该target的条件编译!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/58320.html
相关文章
- AD15中PCB设置NET CLASS规则
- .net 温故知新:【8】.NET 中的配置从xml转向json
- 快速了解 ASP.NET Core Blazor
- Linux.Net:开启新技术之旅(linux.net)
- MySQL Status Rpl_semi_sync_master_net_wait_time 数据库状态作用意思及如何正确
- 原理揭秘.NET 运用Redis图灵缓存原理(.net缓存redis)
- MySQL网络编程:从零到壹。(mysql net)
- NET与MySQL的无限结合(.net 连接mysql)
- Net调用MySQL技术实践(.net 调用mysql)
- Net框架如何使用MySQL数据库(.net能用mysql吗)
- NET 对MySQL 的支持有限(.net不支持mysql)
- asp.net中MD516位和32位加密函数
- asp.net在DNN模块开发中遇到的resx怪问题
- asp.net文件下载功能函数代码整理
- asp.net根据汉字的拼音首字母搜索数据库(附LINQ调用方法)
- asp.net生成静态页笔记
- win2003服务器asp.net权限设置问题及解决方法
- asp.net生成验证码(纯数字)
- asp.net的IndexOf,LastIndexOf,IndexOfAny和LastIndexOfAny的用法
- 基于ASP.NET的lucene.net全文搜索实现步骤
- asp.net无刷新分页实例代码
- jQuery+.net实现浏览更多内容(改编php版本)
- vs.net控件updatePanel实现无刷新的方法
- asp.net使用jQuery获取RadioButtonList成员选中内容和值示例
- ASP.NET网站实时显示时间的方法