チュートリアル: テキスト テンプレートのデバッグ
テキスト テンプレートをデバッグするには、テンプレート変換プロセスの 2 つのステップを理解している必要があります。 発生するエラーの種類はステップごとに異なります。 各ステップは次のとおりです。
テキスト テンプレート変換エンジンが、"生成された変換クラス" というクラスを作成します。 生成された変換クラスを作成するには、テキスト テンプレート変換エンジンが、テキスト テンプレートを解析できることが必要です。
このステップでは、テキスト テンプレート内のエラー (タグの間違いなど) によって解析が妨げられることがあります。 エラーと共にテキスト テンプレートの正確な行番号が報告されます。
生成された変換クラスがエンジンによってコンパイルされます。
このステップでは、コードの誤りが、生成された変換クラスのコンパイルを妨げることがあります。 ほとんどの場合、エラーと共にテキスト テンプレートの正確な行番号が報告されます。 一時ファイル名を持つ変換されたクラスに対してエラーが発生した場合は、テンプレート コード内の角かっこの対応関係が正しくない可能性があります。
コンパイルされた変換クラスが実行されて出力が生成されます。
この段階で発生するエラーには、正確な行番号が報告されません。 テンプレート コードをステップ実行することはできますが、デバッガーを明示的に起動する必要があります。この点については、以降のセクションで説明します。
テキスト テンプレートをデバッグするには、テキスト テンプレート内のエラーを先に修正する必要があります。 生成された変換クラス内のエラーは、その後で修正してください。
注意
テキスト テンプレートを変換するときに発生するエラーの発生源としては、テキスト テンプレート、生成された変換クラス、および、(テキスト テンプレート内から呼び出される) ディレクティブという 3 つのソースが考えられます。 このチュートリアルでは、テキスト テンプレートおよび生成された変換クラス内のエラーをデバッグします。 ただし、これらの手順は、カスタム ディレクティブのデバッグにも適用できます。
このチュートリアルでは、以下のタスクを行います。
不適切なテキスト テンプレート タグのデバッグ
テンプレート コードのステップ実行
テキスト テンプレートの作成
C# のコンソール アプリケーション プロジェクトを作成し、ソリューションにテキスト テンプレートを追加します。 このテキスト テンプレートを後の手順でデバッグすることになります。
テキスト テンプレートを生成するには
Visual Studio で新しい C# コンソール アプリケーションを作成し、「DebugTemplate」という名前を付けます。
DebugTemplate プロジェクトに「DebugTest.tt」という名前のテキスト テンプレート ファイルを追加します。
DebugTest.tt の [カスタム ツール] プロパティが TextTemplatingFileGenerator に設定されていることを確認します。
次の行だけが含まれるようにファイルを編集します。
<#@ output extension=".txt" #>
ファイルを保存します。
テキスト テンプレートが変換されて、対応する出力ファイルが生成されます。 ソリューション エクスプローラーのテキスト テンプレート ファイルの下に新しいファイルが表示されます。
不適切なテキスト テンプレート タグのデバッグ
テキスト テンプレートを記述するときによく発生する構文エラーとして、開始タグまたは終了タグの誤りがあります。 この手順では、不適切なタグをデバッグします。
不適切なテキスト テンプレート タグをデバッグするには
DebugTest.tt に以下のコードを追加します。
注意
このコードには誤りがあります。 デバッグのために意図的に混入したものです。
<# for (int i = 0; i < 3; i++) { > Hello, World! <# } #>
ファイルを保存します。
[エラー一覧] ウィンドウに次のエラーが表示されます。
ブロック内に予期しない開始タグまたは終了タグが見つかりました。 開始タグまたは終了タグの入力に誤りがないこと、および入れ子になっているブロックがテンプレートにないことを確認してください。
このコードのエラーは不適切な終了タグです。 終了タグに # がありません。
[エラー一覧] ウィンドウでエラーをダブルクリックして、該当するコードに移動します。
コードを修正するには、終了タグに # を追加します。
<# for (int i = 0; i < 3; i++) { #>
ファイルを保存します。
これでテキスト テンプレートが変換されて、対応する出力ファイルが生成されます。 [エラー一覧] ウィンドウにエラーは表示されません。
テンプレート コードのステップ実行
テンプレート コードをステップ実行するには、次の 2 つのコードをテンプレートに追加する必要があります。
<@#template debug="true" #>
System.Diagnostics.Debugger.Launch();
次の手順では、存在しない要素インデックスをデバッグします。 このエラーは、前の手順で取り上げたエラーと似ています。 ただし、今回は Visual Studio のデバッガーを使用してデバッグすることにします。
デバッガーを使用してデバッグするには
C:\nonsense というフォルダーを作成し、nonsense.xml という名前で空のテキスト ファイルを保存します。
DebugTest.tt 内のコードを次のコードに置き換えます。
注意
このコードには誤りがあります。 デバッグのために意図的に混入したものです。
<#@ output extension=".txt" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System.Xml" #> <# XmlDocument xDoc = new XmlDocument(); xDoc.Load(@"C:\nonsense\nonsense.xml"); XmlAttributeCollection attributes = xDoc.Attributes; if (attributes != null) { foreach (XmlAttribute attr in attributes) { #> <#= attr.Name #> <# } } #>
ファイルを保存します。
[エラー一覧] ウィンドウに次のエラーが表示されます。
"変換を実行しています: System.Xml.XmlException: ルート要素が見つかりません"
template ディレクティブを追加して debug パラメーターを true に設定します。
<#@ template debug="true" #>
テキスト テンプレートのコードに System.Diagnostics.Debugger.Launch() ステートメントを追加します。
コードは次のようになります。
<#@ template debug="true" #> <#@ output extension=".txt" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System.Xml" #> <# XmlDocument xDoc = new XmlDocument(); System.Diagnostics.Debugger.Launch(); xDoc.Load(@"C:\nonsense\nonsense.xml"); XmlAttributeCollection attributes = xDoc.Attributes; if (attributes != null) { foreach (XmlAttribute attr in attributes) { #> <#= attr.Name #> <# } } #>
変換を再度実行します。
[Visual Studio Just-In-Time デバッガー] ダイアログ ボックスが表示されます。
[利用可能なデバッガー] の一覧の [新しいインスタンス Visual Studio 2010] をクリックし、[はい] をクリックします。
Visual Studio の新しいインスタンスで DebugTest.tt が開きます。
コードをステップ実行して、次の行に移動します。
xDoc.Load(@"C:\nonsense\nonsense.xml");
この行でエラーが発生します。
Visual Studio の 2 番目のインスタンスを閉じます。
[デバッグ] メニューの [デバッグの停止] をクリックします。
[ファイル] メニューの [レジストリ エディターの終了] をクリックします。
変更をソリューションに保存するかどうかを確認するメッセージが表示されたら、[いいえ] をクリックします。
Visual Studio の 2 番目のインスタンスが終了します。
テキスト テンプレートを修正し、デバッグ機能を削除します。
ソリューション エクスプローラーで、DebugTest.tt をダブルクリックしてエディターで開きます。
不適切なファイル名を修正します。 たとえば、次の内容に置き換えます。
@"C:\\Program Files\\Microsoft Visual Studio 10.0\\Xml\\SnippetsIndex.xml"
template ディレクティブと改行を削除します。
テキスト テンプレートは、次のようになります。
<#@ output extension=".txt" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System.Xml" #> <# XmlDocument xDoc = new XmlDocument(); xDoc.Load(@"C:\Program Files\Microsoft Visual Studio 10.0\Xml\SnippetsIndex.xml"); foreach (XmlNode node in xDoc.SelectNodes("//*")) { #> <#= node.Name #> <# } #>
DebugTest.tt を保存します。 エラーが発生しないこと、および結果の .txt ファイルに XML ファイル内のノード名の一覧が出力されていることを確認します。