.net2.0和4.0不同的.net版本的条件编译

【菜科解读】
今天碰到这样一个需求,写的C#库,有时候需要在.net 2.0下编译,有时候需要在.net 4.0下编译,这个库里使用了lambda表达式,使用了扩展方法,使用了几个 System.Core.dll 引入的Action类型。
为了在 .net 2.0 下能够编译成功,我写了一个文件 Patch.cs,定义了 System.Runtime.CompilerServices.ExtensionAttribute 类型,这样就可以在2.0下使用lambda表达式和扩展方法了,同时,添加了几个用到的System.Core.dll 引入的Action类型:
1: namespace System.Runtime.CompilerServices 2: { 3: public class ExtensionAttribute : Attribute { } 4: } 5: 6: namespace System 7: { 8: public delegate void Action(); 9: public delegate void Action(T0 t0,T1 t1);10: }11:
然而,要在.net 4.0 下编译,因为类型已经存在,必须注释掉Patch.cs,很麻烦。
于是想通过条件编译来解决,即:
1: #if NET2 2: 3: namespace System.Runtime.CompilerServices 4: { 5: public class ExtensionAttribute : Attribute { } 6: } 7: 8: namespace System 9: {10: public delegate void Action();11: public delegate void Action(T0 t0,T1 t1);12: }13: 14: #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 文件修改为:
1: #region include "Csmacro_Template.cs" 2: #endregion 3: 4: #if NET2 5: 6: namespace System.Runtime.CompilerServices 7: { 8: public class ExtensionAttribute : Attribute { } 9: }10: 11: namespace System12: {13: public delegate void Action();14: public delegate void Action(T0 t0,T1 t1);15: }16: 17: #endif
#region include 是我引入的 Csmacro 宏语法。
详见 C#模板编程(2): 编写C#预处理器,让模板来的再自然一点 一文。
点击编译,系统会生成一个 Patch_Csmacro.cs 文件,内容如下:
1: #define NET2 2: 3: #if NET2 4: 5: namespace System.Runtime.CompilerServices 6: { 7: public class ExtensionAttribute : Attribute { } 8: } 9: 10: namespace System11: {12: public delegate void Action();13: public delegate void Action(T0 t0,T1 t1);14: }15: 16: #endif
第四步,把生成的 Patch_Csmacro.cs 添加到项目中来。
搞定以后,选择不同的target,编译时产生的就是对该target的条件编译!
.net2.0,和,4.0,不同,的,.net,版本,条件,南宁电子社保卡和社保卡有啥分别,社保卡有什么用途?
南宁电子社保卡和社保卡有什么区别1、卡的形式不同一个是以互联网数据的形式存在,一个是以实体卡片的形式存在,这点相信不用做多介绍了。
也正是这个区别,很多用户认为现在都是手机不离身,电子社保卡更方便。
但新社通小编还是要提醒各位,电子社保卡固然方便,但社保卡也得好好保存不可遗失的。
2、使用方式不同电子社保卡是通过微信生成的二维码来进行医疗或者药品费用支付,而社保卡则是以刷卡的方法进行支付,在这个流行二维码付款的年代,前者真的很占优势呢。
3、使用范围不同进入微信电子社保卡后,点击二维码后可以查询到能使用刷码支付的医疗机构,拿社保卡所在城市为例,长沙目前还没有医疗机构开通了刷码付。
而社保卡则不同,它在任意指定医疗点都可以刷卡支付,比电子社保卡更实用一些。
4、账户差异和电子社保卡最大的区别就是,社保一卡通还有一个独立的金融账户,可以用来当银行卡使用,储蓄、转账样样都行,而电子社保卡则没有银行卡功能。
农保和社保如何办理停保手续,农保和社保都交了如何办(2025/04/16)
(一)社保办理停保条件:1、在职死亡;2、家住农村的参保人员;3、退休后死亡人员个人账户养老金没有领完的人员;4、重复参保的人员。
(二)农保办理停保条件:1、社会保险关系转出农保的:本市从业人员参加城保、镇保。
2、社会保险关系转入农保:符合农保养老金领取条件的农业户籍人员,可申请办理社会保险关系转入农保手续。
?如果同时缴纳了农保和社保,可以采取以下处理方式?:缴费年限折算:对于已参加新农保后转为城镇居民并又参加城镇职工基本养老保险的个体,其新农保的缴费年限可按相应年度城镇职工基本养老保险的缴费基数和比例进行折算。
这样的处理方式有助于更好地衔接两种保险,保证参保人的权益。
但具体折算规则可能因地区而异,需咨询当地社保部门。
保留一种保险:可以选择保留社保或农保,具体根据个人实际情况和缴费年限等因素进行考虑。
若选择保留社保,则需前往农保中心办理停保退费手续。
退还农保:根据当事人选择的退休身份,如果当事人想要以职工身份退休,可以把农保退掉。
同时参加了城镇职工基本养老保险和城乡居民基本养老保险,那么缴纳的两个险种重合的时间里(按月计算),只计算城镇职工基本养老保险的缴费年限,城乡基本养老保险缴费时段里所缴纳的钱,会退还给参保人。
(备注:数据仅供参考,具体以当地有关法规为准)