異なる.NETバージョンの条件付きコンパイル

2820 ワード

.NET 2.0でのコンパイルを成功させるために、System.Runtime.CompilerServices.ExtensionAttributeを定義するファイルPatch.csを書きました.  タイプです.これにより、2.0でlambda式と拡張方法を使用できます.また、System.Core.dllで導入されたActionタイプをいくつか追加します.
 namespace System.Runtime.CompilerServices 
 { 
     public クラス ExtensionAttribute : Attribute { } 
 } 
 namespace System 
 { 
     public delegate void Action(); 
     public delegate void Action(T0 t0,T1 t1); 

ただし、.NET 4.0でコンパイルするには、すでにタイプが存在するため、Patch.csを注釈しなければならないので、面倒です.条件コンパイルで解決したいのです.
#if NET2 
 namespace System.Runtime.CompilerServices 
 { 
     public クラス ExtensionAttribute : Attribute { } 
 } 
 namespace System 
 { 
    public delegate void Action(); 
    public delegate void Action(T0 t0,T1 t1); 

湖南省にある地名 
問題は、.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ファイルの内容は次のとおりです.
#define NET2
修正後のCsmacroのコードは次のとおりです.https://github.com/xiaotie/GebCommon上ダウンロード(現在は.net 2.0と4.0しか処理されていませんが、他のバージョンに対して必要であれば、自分でコードを修正することができます).Csmacroがあれば、すべてがやりやすいです.
最初にCsmacro.exeをPathパスの下に置く
ステップ2では、条件付きコンパイルが必要なプロジェクトを開き、Pre-buildイベント:Csmacro.exe$(ProjectDir)を追加します.
ステップ3では、Patch.csファイルなどのソースファイルを編集します.
 #region include "Csmacro_Template.cs" 
 #endregion 
  
 #if NET2 
  
 namespace System.Runtime.CompilerServices 
 { 
     public クラス ExtensionAttribute : Attribute { } 
 } 
 
namespace System 

    public delegate void Action(); 
    public delegate void Action(T0 t0,T1 t1); 

 
湖南省にある地名 
#region includeは、私が導入したCsmacroマクロ構文です.詳細は、 C#テンプレートプログラミング(2):C#プリプロセッサを作成し、テンプレートをもっと自然にする 文書.コンパイルをクリックすると、次のようなPatch_Csmacro.csファイルが生成されます.
 #define NET2 
  
 #if NET2 
  
 namespace System.Runtime.CompilerServices 
 { 
     public クラス ExtensionAttribute : Attribute { } 
 } 
  
namespace System 

    public delegate void Action(); 
    public delegate void Action(T0 t0,T1 t1); 

 #endif 
ステップ4では、生成されたPatch_Csmacro.csをプロジェクトに追加します.
完了したら、異なるtargetを選択し、コンパイル時に発生するのはそのtargetに対する条件コンパイルです!
テキストリンク:http://www.cnblogs.com/xiaotie/archive/2012/11/26/2789810.html