ドメイン固有言語ソリューションでテキスト テンプレートを変更または追加すると、エンジンがテンプレートをソース コードに変換したとき、または生成されたコードをコンパイルしたときに、エラーが発生することがあります。 次のチュートリアルでは、テキスト テンプレートをデバッグするために実行できるいくつかの操作について説明します。
Note
一般的なテキスト テンプレートの詳細については、「コード生成と T4 テキスト テンプレート」を参照してください。 テキスト テンプレートのデバッグの詳細については、「チュートリアル: テキスト テンプレートのデバッグ」を参照してください。
ドメイン固有言語ソリューションの作成
この手順では、次の特性を持つドメイン固有言語ソリューションを作成します。
名前: DebuggingTestLanguage
ソリューション テンプレート: 最小言語
ファイル拡張子: .ddd
会社名: Fabrikam
ドメイン固有言語ソリューションの作成の詳細については、「方法: ドメイン固有言語ソリューションを作成する」を参照してください。
テキスト テンプレートの作成
ソリューションにテキスト テンプレートを追加します。
テキスト テンプレートを作成するには
ソリューションをビルドし、デバッガーで実行を開始します ([ビルド] メニューの [ソリューションのリビルド] をクリックし、[デバッグ] メニューの [デバッグの開始] をクリックします)。Visual Studio の新しいインスタンスでデバッグ プロジェクトが開きます。
DebugTest.ttという名前のテキスト ファイルをデバッグ プロジェクトに追加します。DebugTest.tt の [カスタム ツール] プロパティが
TextTemplatingFileGeneratorに設定されていることを確認します。
テキスト テンプレートからモデルにアクセスするディレクティブのデバッグ
テキスト テンプレート内のステートメントと式からモデルにアクセスするには、最初に生成されたディレクティブ プロセッサを呼び出す必要があります。 生成されたディレクティブ プロセッサを呼び出すと、モデル内のクラスがプロパティとしてテキスト テンプレート コードで使用できるようになります。 詳細については、「テキスト テンプレートからモデルへのアクセス」を参照してください。
次の手順では、不適切なディレクティブ名とプロパティ名をデバッグします。
不適切なディレクティブ名をデバッグするには
DebugTest.tt 内のコードを次のコードに置き換えます。
Note
コードにはエラーが含まれています。 デバッグするためにエラーを取り込んでいます。
<#@ template language="C#" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation"#> <#@ output extension=".txt" #> <#@ modelRoot processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=ExampleModel" #> Model: <#= this.ExampleModel #> <# foreach (ExampleElement element in this.ExampleModel.Elements) { #> Element: <#= element.Name #> <# } #>ソリューション エクスプローラーで、DebugTest.tt を右クリックし、[カスタム ツールの実行] をクリックします。
[エラー一覧] ウィンドウに次のエラーが表示されます。
プロセッサ 'DebuggingTestLanguageDirectiveProcessor' ではディレクティブ 'modelRoot' はサポートされません。 変換は実行されません。
この場合、ディレクティブ呼び出しに無効なディレクティブ名が含まれています。 ディレクティブ名として
modelRootを指定しましたが、正しいディレクティブ名はDebuggingTestLanguageです。[エラー一覧] ウィンドウでエラーをダブルクリックすると、そのコードに移動します。
コードを修正するには、ディレクティブ名を
DebuggingTestLanguageに変更します。変更が強調表示されます。
ソリューション エクスプローラーで、DebugTest.tt を右クリックし、[カスタム ツールの実行] をクリックします。
これで、システムによってテキスト テンプレートが変換され、対応する出力ファイルが生成されます。 [エラー一覧] ウィンドウにエラーは表示されません。
不適切なプロパティ名をデバッグするには
DebugTest.tt 内のコードを次のコードに置き換えます。
Note
コードにはエラーが含まれています。 デバッグするためにエラーを取り込んでいます。
<#@ template language="C#" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation"#> <#@ output extension=".txt" #> <#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=LibraryModel" #> Model: <#= this.ExampleModel #> <# foreach (ExampleElement element in this.ExampleModel.Elements) { #> Element: <#= element.Name #> <# } #>ソリューション エクスプローラーで、DebugTest.tt を右クリックし、[カスタム ツールの実行] をクリックします。
[エラー一覧] ウィンドウに、次のいずれかのエラーが表示されます。
(C#)
変換をコンパイルしています: Microsoft.VisualStudio.TextTemplating<GUID>. GeneratedTextTransformation' に 'ExampleModel' の定義がありません
(Visual Basic)
変換をコンパイルしています: 'ExampleModel' は 'Microsoft.VisualStudio.TextTemplating<GUID>.GeneratedTextTransformation' のメンバーではありません。
この場合、テキスト テンプレート コードに無効なプロパティ名が含まれています。 プロパティ名として
ExampleModelが指定されていますが、正しいプロパティ名はLibraryModelです。 次のコードに示すように、provides パラメーターで正しいプロパティ名を見つけることができます。<#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=LibraryModel" #>[エラー一覧] ウィンドウでエラーをダブルクリックすると、そのコードに移動します。
コードを修正するには、テキスト テンプレート コードでプロパティ名を
LibraryModelに変更します。変更が強調表示されます。
<#@ template language="C#" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation"#> <#@ output extension=".txt" #> <#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=LibraryModel" #> Model: <#= this.LibraryModel #> <# foreach (ExampleElement element in this.LibraryModel.Elements) { #> Element: <#= element.Name #> <# } #>ソリューション エクスプローラーで、DebugTest.tt を右クリックし、[カスタム ツールの実行] をクリックします。
これで、システムによってテキスト テンプレートが変換され、対応する出力ファイルが生成されます。 [エラー一覧] ウィンドウにエラーは表示されません。