2009-02-24 22 views
7

私はプロジェクトのための小さなクラスジェネレータを作成しています。私はCodeDOMについて読んでいるので、クラスの作成のセマンティクスは問題ではないようですが、世代を開発およびデプロイメントプロセスに最適に統合する方法は不明です。C#コード生成

  1. クラスの作成をどのようにトリガーする必要がありますか?私はそれがビルドプロセスの一部であるべきであることを読んだが、どうすればよいのだろうか?

  2. ここでクラスを作成する必要がありますか?私は、ファイルを手で編集してはならず、ソース管理にチェックインしてはならないことを読んだ。私はこれについて心配して、ジェネレータエンジンと同じディレクトリにクラスを生成するだけですか?

答えて

0

質問に対する回答は、生成されたクラスの目的によって部分的に異なります。

開発のクラスとして生成されたクラスは、テキストファイルとして生成し、他のクラスと同様にSCMにチェックインする必要があります。

システムの動作の一部として、クラスがランタイムで動的に生成された場合、私はCodeDOMをまったく使用しません。私は反射を使用します。

8

T4テンプレート(VS2008に組み込まれています)をご覧ください。それはあなたのためのコードを生成する "テンプレート"クラスを作成することができます。 Oleg Sychは、このための貴重なリソースです。

Link for Oleg's tutorial on code generation

+0

これはどのようにビルドの問題を解決しますか? これはBluの意味ではわかりませんが、自動生成コードをビルドに組み込みたいのですが... C#クラスを生成するIDLファイルがいくつかあります。今、他のチームメンバーがIDLを変更した場合、私はC#クラスを再構築したい。テンプレートアドレスはそれですか? – ripper234

+0

T4テンプレートは、すべてのビルドでクラスを生成するように設定できます。それは時間がかかりません、そして、良い習慣です。 –

+0

@Michael:ビルドの速度が遅くなるので、ファイルを不必要に再生成しないでください。ビルドを遅くするすべてが足を震え、何度も何度も繰り返し感じられるこの問題はビルドの確立後に修正するよりも防ぐのが簡単だと私は信じています。 –

0

私はT4テンプレートが存在することを知っています(多くの人が使用しています)が、私は自分で使っていません。これらのほかに、2つの主なオプションがあります。

  1. プロジェクト内でソースを右に変換するには、SingleFileGeneratorを使用します。編集した文書を保存すると、自動的にコードファイルが再生成されます。ソースコントロールを使用すると、生成されたファイルがプロジェクトの一部としてチェックインされます。これにはいくつかの制限があります。
    • 入力ごとに1つの出力しか生成できません。
    • ファイルが生成される順序を制御することはできず、ビルド時にファイルが生成されないため、出力は単一の入力ファイルからのみ効果的に派生することができます。
    • 入力ファイルを編集する予定の場合は、開発者のマシンに1台のファイルジェネレータをインストールする必要があります。生成されたコードはソース制御にあるため、入力を編集しないと出力を再生成する必要はありません。
    • 入力が保存されたときにのみ出力が生成されるため、出力は入力ファイルの正確な内容(システムクロックを含む)以外の状態に依存してはなりません。
  2. コードをビルドの一部として生成します。このために、MSBuildターゲットファイルを作成します。このために、入力と出力の完全な制御が可能で、依存関係を処理することができます。システム状態は、必要に応じて入力依存として扱うことができますが、コード生成を必要とするすべてのビルドは、前もって生成された結果を使用するビルドよりも時間がかかります。結果(生成されたソースファイル)は、一般にobjディレクトリに配置され、csc(C#コンパイラ)に行く入力リストに追加されます。このメソッドの制限:
    • SingleFileGeneratorよりもターゲットファイルを書くのが難しいです。
    • ビルドは、ユーザーが入力を編集するかどうかに関係なく、出力の生成に依存します。
    • 生成されたコードはプロジェクトの一部ではないので、ブレークポイントの設定などのために生成されたコードを表示するのは少し難しいです。
関連する問題