成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實現針對不同.net版本的條件編譯

開發 后端 開發工具
今天碰到這樣一個需求,寫的C#庫,有時候需要在.net 2.0下編譯,有時候需要在.net 4.0下編譯,這個庫里使用了lambda表達式,使用了擴展方法,使用了幾個 System.Core.dll 引入的Action類型。

今天碰到這樣一個需求,寫的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#預處理器,讓模板來的再自然一點 一文。點擊編譯,系統會生成一個 Patch_Csmacro.cs 文件,內容如下:

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

第四步,把生成的 Patch_Csmacro.cs 添加到項目中來。

搞定以后,選擇不同的target,編譯時產生的就是對該target的條件編譯!

原文鏈接:http://www.cnblogs.com/xiaotie/archive/2012/11/26/2789810.html

責任編輯:林師授 來源: 博客園
相關推薦

2012-11-27 09:34:10

.NET版本

2009-07-02 13:40:45

面試

2010-01-21 18:19:45

VB.NET條件編譯

2011-02-24 12:53:51

.NET異步傳統

2011-12-05 14:07:50

Java

2009-08-03 16:06:28

ASP.NET下拉框

2015-01-22 09:22:47

OpenStack存儲云開源云

2021-01-05 07:51:06

版本化ASP

2009-09-17 13:26:55

.NET方法簽名

2010-01-20 11:15:38

CC++編譯器

2025-01-10 00:41:38

版本控制API

2013-03-05 14:51:05

UbuntuKDEGnome

2009-12-17 16:02:58

紅旗Linux

2009-08-04 18:05:37

動態編譯ASP.NET

2010-12-20 15:25:36

編譯時間.NET

2009-12-17 16:53:13

.NET Framew

2010-01-13 14:32:11

VB.NET確定文件版

2016-12-01 09:57:24

PHP錯誤機制

2024-09-04 09:18:03

分區策略

2009-08-05 17:04:14

.NET委托
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美在线免费观看 | 亚洲va欧美va天堂v国产综合 | 国产精品免费一区二区三区四区 | 国产精品明星裸体写真集 | a欧美| 国产成人一区二 | 狠狠综合久久av一区二区小说 | www.亚洲视频.com | 九色.com | 欧美久久久久 | 午夜精品一区二区三区在线 | 成人久久一区 | 九九九视频在线观看 | 欧美成人免费在线 | 亚洲欧美日韩中文字幕一区二区三区 | 欧美成人在线影院 | 亚洲精品视频一区二区三区 | 午夜精品91 | 国产精品国色综合久久 | av黄在线观看 | 国产日韩欧美一区二区 | 99精品久久99久久久久 | 欧洲精品在线观看 | 成人午夜影院 | 精品亚洲一区二区三区 | 日韩美女一区二区三区在线观看 | 精品福利一区二区三区 | 91传媒在线观看 | 欧美一级毛片免费观看 | 成人免费观看网站 | 成人免费在线观看 | 欧美片网站免费 | 亚洲一区在线播放 | 国产精品视频偷伦精品视频 | 成人a免费 | 日韩欧美日韩在线 | 男人天堂免费在线 | 日韩精品在线看 | 一区二区三区日 | 在线观看国产视频 | 久久99精品久久久久久国产越南 |