熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

針對不同.NET版本的條件編譯

2022-06-13   來源: .NET編程 

  為了在NET 下能夠編譯成功我寫了一個文件 Patchcs定義了SystemRuntimeCompilerServicesExtensionAttribute 類型這樣就可以在下使用lambda表達式和擴展方法了同時添加了幾個用到的SystemCoredll引入的Action類型

  namespace SystemRuntimeCompilerServices

  {

  public class ExtensionAttribute : Attribute { }

  }

  namespace System

  {

  public delegate void Action()

  public delegate void Action<TT>(T tT t

  }

  然而要在NET 下編譯因為類型已經存在必須注釋掉Patchcs很麻煩於是想通過條件編譯來解決

  #if NET

  namespace SystemRuntimeCompilerServices

  {

  public class ExtensionAttribute : Attribute { }

  }

  namespace System

  {

  public delegate void Action()

  public delegate void Action<TT>(T tT t

  }

  #endif

  問題是net 裡沒有定義和net版本有關的指示符怎麼辦呢?自己動手豐衣足食使用Build Events在編譯之前自動偵測出項目所使用的net版本定義出我們想要的指示符

  在 C#模板編程( 編寫C#預處理器讓模板來的再自然一點一文中寫了一個程序 Csmacroexe 來實現C#下的模板機制本文在Csmacroexe 的基礎上增加偵測項目所引用的net 版本的功能

  原理查找項目目錄下的 csproj 文件解析它找到節點TargetFrameworkVersion判斷net版本然後生成一個Csmacro_Templatecs文件在裡面 #define 版本指示符例如Net 項目生成的 Csmacro_Templatecs 文件內容為

  #define NET

  修改後Csmacro的代碼可在https://githubcom/xiaotie/GebCommon上下載(目前只處理了 net 如需要針對其它版本可自行修改代碼)有了 Csmacro一切就好辦了

  第一步把 Csmacroexe 放在Path路徑下

  第二步打開需要條件編譯的項目添加 Prebuild 事件Csmacroexe $(ProjectDir)

  第三步編輯源文件Patchcs 文件修改為

  #region include Csmacro_Templatecs

  #endregion

  #if NET

  namespace SystemRuntimeCompilerServices

  {

  public class ExtensionAttribute : Attribute { }

  }

  namespace System

  {

  public delegate void Action()

  public delegate void Action<TT>(T tT t

  }

  #endif

  #region include 是我引入的 Csmacro 宏語法詳見 C#模板編程( 編寫C#預處理器讓模板來的再自然一點 一文點擊編譯系統會生成一個 Patch_Csmacrocs 文件內容如下

  #define NET

  #if NET

  namespace SystemRuntimeCompilerServices

  {

  public class ExtensionAttribute : Attribute { }

  }

  namespace System

  {

  public delegate void Action()

  public delegate void Action<TT>(T tT t

  }

  #endif

  第四步把生成的 Patch_Csmacrocs 添加到項目中來

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


From:http://tw.wingwit.com/Article/program/net/201311/16137.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.