日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
實(shí)現(xiàn)針對(duì)不同.net版本的條件編譯

今天碰到這樣一個(gè)需求,寫(xiě)的C#庫(kù),有時(shí)候需要在.net 2.0下編譯,有時(shí)候需要在.net 4.0下編譯,這個(gè)庫(kù)里使用了lambda表達(dá)式,使用了擴(kuò)展方法,使用了幾個(gè) System.Core.dll 引入的Action類(lèi)型。

當(dāng)雄網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)

為了在 .net 2.0 下能夠編譯成功,我寫(xiě)了一個(gè)文件 Patch.cs,定義了 System.Runtime.CompilerServices.ExtensionAttribute 類(lèi)型,這樣就可以在2.0下使用lambda表達(dá)式和擴(kuò)展方法了,同時(shí),添加了幾個(gè)用到的System.Core.dll 引入的Action類(lèi)型:

 
 
 
  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 t0,T1 t1);
  9.   }

然而,要在.net 4.0 下編譯,因?yàn)轭?lèi)型已經(jīng)存在,必須注釋掉Patch.cs,很麻煩。于是想通過(guò)條件編譯來(lái)解決,即:

 
 
 
  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 t0,T1 t1);
  10. }  
  11. #endif

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

在 C#模板編程(2): 編寫(xiě)C#預(yù)處理器,讓模板來(lái)的再自然一點(diǎn) 一文中,寫(xiě)了一個(gè)程序 Csmacro.exe 來(lái)實(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)容為:

 
 
 
  1. #define NET2

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

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

第二步,打開(kāi)需要條件編譯的項(xiàng)目,添加 Pre-build 事件:Csmacro.exe $(ProjectDir)

第三步,編輯源文件,如,Patch.cs 文件修改為:

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

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

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

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

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


網(wǎng)頁(yè)名稱:實(shí)現(xiàn)針對(duì)不同.net版本的條件編譯
網(wǎng)站鏈接:http://m.5511xx.com/article/djpogpi.html