自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

針對(duì)不同.NET版本的條件編譯

開發(fā) 后端
今天碰到這樣一個(gè)需求,寫的C#庫,有時(shí)候需要在.NET 2.0下編譯,有時(shí)候需要在.NET 4.0下編譯,這個(gè)庫里使用了Lambda表達(dá)式,使用了擴(kuò)展方法,使用了幾個(gè) System.Core.dll 引入的Action類型。

為了在 .NET 2.0 下能夠編譯成功,我寫了一個(gè)文件 Patch.cs,定義了 System.Runtime.CompilerServices.ExtensionAttribute  類型,這樣就可以在2.0下使用lambda表達(dá)式和擴(kuò)展方法了,同時(shí),添加了幾個(gè)用到的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); 

然而,要在.NET 4.0 下編譯,因?yàn)轭愋鸵呀?jīng)存在,必須注釋掉Patch.cs,很麻煩。于是想通過條件編譯來解決,即:

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

問題是,.net 里沒有定義和.net版本有關(guān)的指示符。怎么辦呢?自己動(dòng)手,豐衣足食,使用Build Events在編譯之前自動(dòng)偵測(cè)出項(xiàng)目所使用的.net版本,定義出我們想要的指示符。

在 C#模板編程(2): 編寫C#預(yù)處理器,讓模板來的再自然一點(diǎn)一文中,寫了一個(gè)程序 Csmacro.exe 來實(shí)現(xiàn)C#下的模板機(jī)制,本文在Csmacro.exe 的基礎(chǔ)上,增加偵測(cè)項(xiàng)目所引用的.net 版本的功能。

原理:查找項(xiàng)目目錄下的 csproj 文件,解析它,找到節(jié)點(diǎn)TargetFrameworkVersion,判斷.net版本,然后生成一個(gè)Csmacro_Template.cs文件,在里面 #define 版本指示符。例如,對(duì) .Net 2.0 項(xiàng)目,生成的 Csmacro_Template.cs 文件內(nèi)容為:

#define NET2

修改后Csmacro的代碼可在:https://github.com/xiaotie/GebCommon上下載(目前只處理了 .net 2.0 和 4.0,如需要針對(duì)其它版本,可自行修改代碼)。有了 Csmacro,一切就好辦了。

***步,把 Csmacro.exe 放在Path路徑下

第二步,打開需要條件編譯的項(xiàng)目,添加 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 System 
  12.     public delegate void Action(); 
  13.     public delegate void Action<T0,T1>(T0 t0,T1 t1); 
  14.  
  15. #endif 

#region include 是我引入的 Csmacro 宏語法。詳見 C#模板編程(2): 編寫C#預(yù)處理器,讓模板來的再自然一點(diǎn) 一文。點(diǎn)擊編譯,系統(tǒng)會(huì)生成一個(gè) Patch_Csmacro.cs 文件,內(nèi)容如下:

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

第四步,把生成的 Patch_Csmacro.cs 添加到項(xiàng)目中來。

搞定以后,選擇不同的target,編譯時(shí)產(chǎn)生的就是對(duì)該target的條件編譯!

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

【編輯推薦】

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2012-11-27 10:14:01

.net條件編譯

2009-07-02 13:40:45

面試

2010-01-21 18:19:45

VB.NET條件編譯

2015-01-22 09:22:47

OpenStack存儲(chǔ)云開源云

2009-09-17 13:26:55

.NET方法簽名

2010-01-20 11:15:38

CC++編譯器

2009-12-17 16:02:58

紅旗Linux

2013-03-05 14:51:05

UbuntuKDEGnome

2009-08-04 18:05:37

動(dòng)態(tài)編譯ASP.NET

2010-12-20 15:25:36

編譯時(shí)間.NET

2009-12-17 16:53:13

.NET Framew

2024-09-04 09:18:03

分區(qū)策略

2009-08-14 00:30:09

C#條件編譯指令

2016-12-01 09:57:24

PHP錯(cuò)誤機(jī)制

2009-08-05 17:04:14

.NET委托

2012-11-16 10:14:54

Windows 8

2009-12-09 16:43:48

VS.NET 2003

2010-05-18 14:14:03

MySQL關(guān)聯(lián)left

2010-04-23 15:34:41

Oracle 數(shù)據(jù)庫

2011-02-24 12:53:51

.NET異步傳統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)