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