网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

实现针对不同.net版本的条件编译

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/04

今天碰到这样一个需求,写的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.   namespace System 
  6.   { 
  7.       public delegate void Action(); 
  8.       public delegate void Action<T0,T1>(T0 t0,T1 t1); 
  9.   } 

然而,要在.net 4.0 下编译,因为类型已经存在,必须注释掉Patch.cs,很麻烦。于是想通过条件编译来解决,即:

  1. #if NET2 
  2.  
  3. namespace System.Runtime.CompilerServices 
  4.     public class ExtensionAttribute : Attribute { } 
  5. }   
  6.  
  7. namespace System 
  8.     public delegate void Action(); 
  9.     public delegate void Action<T0,T1>(T0 t0,T1 t1); 
  10. }   
  11.  
  12. #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 文件内容为:

  1. #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. #if NET2 
  4.  
  5. namespace System.Runtime.CompilerServices 
  6.     public class ExtensionAttribute : Attribute { } 
  7.  
  8.  
  9. namespace System 
  10.     public delegate void Action(); 
  11.     public delegate void Action<T0,T1>(T0 t0,T1 t1); 
  12.  
  13. #endif 

#region include 是我引入的 Csmacro 宏语法。详见 C#模板编程(2): 编写C#预处理器,让模板来的再

网学推荐

免费论文

原创论文

设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号