テキスト テンプレート変換プロセス
テキスト テンプレート変換プロセスでは、テキスト テンプレート ファイルを入力として受け取り、新しいテキスト ファイルを出力として生成します。たとえば、テキスト テンプレートを使用すると、Visual Basic または C# のコードや、HTML レポートを生成できます。
このプロセスには、エンジン、ホスト、およびディレクティブ プロセッサという 3 つのコンポーネントが関与します。プロセスを制御するのはエンジンです。エンジンは、ホストおよびディレクティブ プロセッサと対話して出力ファイルを生成します。ホストは、ファイルとアセンブリの特定など、環境との対話を行います。ディレクティブ プロセッサは、XML ファイルまたはデータベースからデータを読み取る機能などを提供します。
テキスト テンプレート変換プロセスは、2 つのステップに分けられます。まず、エンジンが一時クラスを作成します。これは生成された変換クラスと呼ばれます。このクラスには、ディレクティブとコントロール ブロックによって生成されたコードが含まれます。次に、エンジンは生成された変換クラスをコンパイルして実行し、出力ファイルを生成します。
コンポーネント
コンポーネント |
Description |
カスタマイズの可否 |
---|---|---|
エンジン |
エンジン コンポーネントは、テキスト テンプレート変換プロセスを制御します。 |
いいえ。 |
ホスト |
ホストは、エンジンとユーザー環境間のインターフェイスです。Visual Studio は、テキスト変換プロセスのホストです。 |
はい。カスタム ホストを記述できます。 |
ディレクティブ プロセッサ |
ディレクティブ プロセッサは、テキスト テンプレート内のディレクティブを処理するクラスです。ディレクティブを使用すると、入力ソースからテキスト テンプレートにデータを渡すことができます。 |
はい。カスタム ディレクティブ プロセッサを記述できます。 |
エンジン
エンジンは、変換プロセスで使用されるすべてのファイルを処理するホストから、テンプレートを文字列として受け取ります。次に、カスタム ディレクティブ プロセッサと環境のその他の要素を特定するようにホストに要求します。その後、エンジンは、生成された変換クラスをコンパイルして実行します。エンジンは、生成されたテキストをホストに返します。ホストは通常、このテキストをファイルに保存します。
ホスト
ホストは、変換プロセス外部の環境に関係する処理を行います。次のような処理が含まれます。
エンジンまたはディレクティブ プロセッサが要求したテキストおよびバイナリ ファイルを特定する。ホストは、ディレクトリとグローバル アセンブリ キャッシュ内のアセンブリを探すことができます。ホストは、エンジン用のカスタム ディレクティブ プロセッサ コードを特定できます。また、テキスト ファイルを特定して読み取り、そのコンテンツを文字列として返すこともできます。
エンジンが変換クラスの生成に使用する、一連の標準アセンブリと名前空間を提供する。
エンジンが生成された変換クラスをコンパイルして実行するときに使用されるアプリケーション ドメインを提供する。テンプレート コード内のエラーからホスト アプリケーションを保護するために、独立したアプリケーション ドメインが使用されます。
生成された出力ファイルを書き込む。
生成された出力ファイルの既定の拡張子を設定する。
テキスト テンプレートの変換エラーを処理する。たとえば、ホストは、エラーをユーザー インターフェイスに表示したり、エラーをファイルに書き込んだりできます (Visual Studio では、エラーはエラー メッセージ ウィンドウに表示されます)。
ユーザーが値を指定せずにディレクティブを呼び出した場合に、必須パラメーターの値を提供する。ディレクティブ プロセッサは、ディレクティブとパラメーターの名前を指定して、既定値を提供するようにホストに要求できます (ホストに既定値がある場合)。
ディレクティブとディレクティブ プロセッサ
ディレクティブは、テキスト テンプレート内のコマンドです。ディレクティブにより、生成プロセスにパラメーターが提供されます。通常、ディレクティブはモデルなどの入力のソースと型、および出力ファイル名の拡張子を定義します。
ディレクティブ プロセッサは、1 つ以上のディレクティブを処理できます。テンプレートを変換するには、テンプレート内のディレクティブを処理できるディレクティブ プロセッサがインストールされている必要があります。
ディレクティブは、生成された変換クラスにコードを追加することで機能します。ディレクティブはテキスト テンプレートから呼び出します。エンジンによって変換クラスが生成されるときに、すべてのディレクティブの呼び出しが処理されます。ディレクティブが正常に呼び出されると、テキスト テンプレートに記述された残りのコードがディレクティブによって提供される機能を利用できるようになります。たとえば、テンプレートで import ディレクティブを呼び出すには、次のように記述します。
<#@ import namespace="System.Text" #>
標準のディレクティブ プロセッサは、生成された変換クラスを使用して、これを using ステートメントに変換します。これにより、System.Text.StringBuilder と修飾しなくても、テンプレート コードの残りの部分で StringBuilder クラスを使用できるようになります。