2013-03-01 20 views
9

TextTemplatingFilePreprocessorを使用してT4で読んだ記事は、プロジェクトの一部となるコードを動的に生成する方法を示し、プロジェクトでコンパイルされます。T4とC#を使用して実行時に動的コードをコンパイル

T4を使用して、実行時にコンパイルされ、dllに出力され、ロードされて実行され、dllに関連付けられた通常の可視性機能にアクセスできるコードを生成できますか?

もしそうなら、例を挙げてください。

私はILを使ってダイナミックDLLを生成するのと同じことを効果的にやろうとしていますが、C#を使用しています。

EDIT

私はこれを必要とする特定のケースは簡単です。私はサービスにメッセージをルーティングするメッセージルーターを作成しています。サービスはローカルでもリモートでもかまいません。宣言的なスクリプトはC#にコンパイルされます。動的部分は「このサービスはローカルかリモートか」です。それに応じて出力C#も変更されます。ルーティングのスタイルはローカル/リモートのために異なります。したがって、動的な性質です。

これは私が必要とするものの1つの例です。これを行うには

+0

私はあなたがそのためのコード生成を必要とするかわかりません。あなたは、ローカルサービス用とリモート用の2つのタイプを持つことができませんし、実行時にどちらを使うかを選択できますか? – svick

+0

確かに、正しいデリゲートを接続する単純なifステートメントです。私はこれを、ダイナミックに役立つ単純な例として使用しています。私はまだ完全にマッピングされていないより複雑なケースがあります。 – IamIC

答えて

4

、あなたは二つのことを知っておく必要があります。

  1. あなたはC#のソースコードを含む実行時にいくつかのテキストを生成するためのランタイムT4テンプレートを使用することができます。
  2. CSharpCodeProviderを使用すると、実行時にテキストからアセンブリをコンパイルできます。または、生成されたテキストに対して手動でcsc.exe(コマンドラインC#コンパイラ)を実行することもできますが、それはもっと複雑になります。 (実際にCSharpCodeProviderはまさにその舞台裏を行います。)

コードは次のようになります。

var template = new RuntimeTextTemplate(); 
string code = template.TransformText(); 

var compiler = new CSharpCodeProvider(); 
var result = compiler.CompileAssemblyFromSource(
    new CompilerParameters { OutputAssembly = "assembly.dll" }, code); 
+0

私は、T4がどのように実行時にデータを評価することができるか(自然に出力を決定するデータ)を示す何かを教えてください。 – IamIC

+1

@IanCランタイムテンプレートを作成すると、実行時に評価されます(コードサンプルのように)。テンプレートの入力を変更するには、たとえば、「クラスフィーチャコントロールブロック」のプロパティを使用してテンプレートからアクセスできます。 – svick

+0

@ ode2code http://odetocode.com/blogs/scott/archive/2011/01/04/preprocessed-t4-templates.aspxの素晴らしい投稿があります。これは部分クラスに単純なデータを追加する方法を示していますが、これは多くの人々がランタイムテンプレートのような技術です。 – GarethJ

関連する問題