テキスト テンプレートでブレークポイントを設定できます。 デザイン時テキスト テンプレートをデバッグするには、テキスト テンプレート ファイルを保存し、ソリューション エクスプローラーのファイルのショートカット メニューで [ T4 テンプレートのデバッグ ] を選択します。 ランタイム テキスト テンプレートをデバッグするには、そのテンプレートが属するアプリケーションをデバッグするだけです。
テキスト テンプレートをデバッグするには、テンプレート変換プロセスの手順を理解する必要があります。 各ステップでさまざまな種類のエラーが発生する可能性があります。 手順は次のとおりです。
| Step | デザイン時テンプレート: それが発生した場合 | ランタイム テンプレート: 発生時 |
|---|---|---|
| コードはテキスト テンプレートから生成されます。 ディレクティブ内のエラー、またはタグの不一致または障害 <#...#> 。 |
テンプレートを保存するか、テキスト変換を呼び出すとき。 | テンプレートを保存するか、テキスト変換を呼び出すとき。 |
| 生成されたコードがコンパイルされます。 テンプレート コードのコンパイル エラー。 |
前の手順の直後。 | アプリケーション コードと共に。 |
| コードが実行されます。 テンプレート コードの実行時エラー。 |
前の手順の直後。 | アプリケーションが実行され、テンプレート コードが呼び出されたとき。 |
ほとんどの場合、テンプレート コードの行番号はエラー レポートに表示されます。 エラー レポートが一時ファイル名を参照する場合、通常の原因はテキスト テンプレートのコードの角かっこの不一致です。
テキスト テンプレートにブレークポイントを設定し、通常の方法でデバッグできます。
一般的なエラーと修正
次の表に、最も一般的なエラーとその修正を示します。
| エラーメッセージ | Description | 解決策 |
|---|---|---|
| Transformation クラスが継承する基底クラス '{0}' を読み込めませんでした。 | テンプレート ディレクティブの inherits パラメーターで指定された基底クラスが見つからない場合に発生します。 このメッセージは、テンプレート ディレクティブの行番号を示します。 |
指定したクラスが存在し、そのクラスが存在するアセンブリがアセンブリ ディレクティブで指定されていることを確認します。 |
| ファイルのインクルード テキストを解決できませんでした:{0} | 含まれているテンプレートが見つからない場合に発生します。 メッセージは、要求されたインクルード ファイルの名前を提供します。 | ファイル パスが元のテンプレート パスに対する相対パスであるか、ファイルがホストに登録されている場所にあるか、ファイルへの完全なパスがあることを確認します。 |
| 変換オブジェクトの初期化時にエラーが生成されました。 変換は実行されません。 | 変換クラスの 'Initialize()' が失敗したか、false が返されたときに発生します。 | Initialize() 関数のコードは、 <#@template#> ディレクティブ プロセッサで指定された基本変換クラスから取得されます。 初期化が失敗する原因となったエラーは、おそらくエラー一覧にあります。 失敗した理由を調査します。 テンプレートをデバッグする手順に従って、Initialize() の実際に生成されたコードを確認できます。 |
| ディレクティブ プロセッサ '{0}' のアセンブリ '{1}' に FullTrust アクセス許可セットが付与されませんでした。 ディレクティブ プロセッサを提供できるのは、信頼されたアセンブリだけです。 このディレクティブ プロセッサは読み込まれません。 | システムがディレクティブ プロセッサを含むアセンブリに FullTrust 権限を付与しない場合に発生します。 このメッセージは、アセンブリの名前とディレクティブ プロセッサの名前を提供します。 | ローカル コンピューターで信頼されたアセンブリのみを使用してください。 |
| パス '{0}' は、このコンピューターに対してローカルであるか、信頼されたゾーンの一部である必要があります。 | ディレクティブまたはアセンブリ ディレクティブが、ローカル コンピューターまたはネットワークの信頼ゾーン上にないファイルを参照するときに発生します。 | ディレクティブまたはアセンブリ ディレクティブが配置されているディレクトリが信頼済みゾーンにあることを確認します。 Internet Explorer を使用して、信頼されたゾーンにネットワーク ディレクトリを追加できます。 |
| "無効なトークン 'catch' や "名前空間にメンバーを直接含めることはできません" などの複数の構文エラー | テンプレート コード内の閉じ中かっこが多すぎます。 コンパイラは、標準の生成コードと混同しています。 | コード区切り記号内の中かっこと角かっこの数を確認します。 |
ループまたは条件が正しくコンパイルまたは実行されていません。 たとえば、 <#if (i>10)#> Number is: <#= i #>と指定します。このコードは常に i の値を出力します。 条件は "Number is:" のみです。 |
C# では、コントロール ステートメントに埋め込まれたテキスト ブロックを常に中かっこで囲みます。 | 中括弧を追加してください: <#if (i>10) { #> Number is: <#= i #><# } #>。 |
| デザイン時テンプレートを処理するとき、またはランタイム (前処理済み) テンプレートをコンパイルする場合は、"式が複雑すぎます"。 Visual Studio は、ランタイム テンプレートによって生成されたコードを検査しようとすると動作を停止します。 |
テキスト ブロックが長すぎます。 T4 は、テンプレート行ごとに 1 つの文字列リテラルを使用して、テキスト ブロックを文字列連結式に変換します。 非常に長いテキスト ブロックは、コンパイラのサイズ制限を超える可能性があります。 | 長いテキスト ブロックを次のような式ブロックで分割します。<#= "" #> |
警告の説明と修正
次の表に、最も一般的な警告と修正プログラム (使用可能な場合) を示します。
| 警告メッセージ | Description | 解決策 |
|---|---|---|
| インクルード ファイル '{0}' を読み込むと、null または空の文字列が返されました。 | 含まれているテキスト テンプレート ファイルが空白の場合に発生します。 このメッセージは、含まれているファイルのファイル名を示します。 | インクルード ディレクティブを削除するか、ファイルにコンテンツがあることを確認します。 |
| 変換のコンパイル: | 変換のコンパイル時にコンパイラから発生したすべてのエラーまたは警告の先頭にこの文字列を付加します。 この文字列は、コンパイラがエラーまたは警告を発生させたことを意味します。 | DLL の検索で問題が発生した場合は、DLL が GAC 内にある場合は、完全パスまたは完全修飾の厳密な名前を指定する必要があります。 |
| パラメーター '{0}' はディレクティブに既に存在します。 重複するパラメーターは無視されます。 | ディレクティブでパラメーターが複数回指定されたときに発生します。 このメッセージは、パラメーターの名前とディレクティブの行番号を提供します。 | 重複するパラメーター指定を削除します。 |
| インクルード ファイル '{0}' の読み込み中にエラーが発生しました。 この include ディレクティブは無視されます。 |
include ディレクティブで指定されたファイルが見つからない場合に発生します。 メッセージは、ファイルの名前とディレクティブの行番号を提供します。 |
インクルード ファイルが、元のテキスト テンプレート ファイルと同じディレクトリ、またはホストに登録されているインクルード ディレクトリのいずれかに存在することを確認します。 |
| Transformation クラスに無効な基底クラスが指定されました。 基本クラスは、Microsoft.VisualStudio.TextTemplating.TextTransformation から派生する必要があります。 | テンプレート ディレクティブの inherits パラメーターが、 TextTransformationから継承しないクラスを指定するときに発生します。 このメッセージは、テンプレート ディレクティブの行番号を示します。 |
TextTransformationから派生するクラスを指定します。 |
| 'template' ディレクティブで無効なカルチャが指定されました。 カルチャーは"xx-XX"形式でなければなりません。 インバリアント カルチャが使用されます。 | テンプレート ディレクティブのカルチャ パラメーターが正しく指定されていない場合に発生します。 このメッセージは、テンプレート ディレクティブの行番号を示します。 | カルチャ パラメーターを"xx-XX" 形式の有効なカルチャに変更します。 |
| テンプレート ディレクティブで無効なデバッグ値 '{0}' が指定されました。 デバッグ値は、"true" または "false" である必要があります。 既定値の "false" が使用されます。 | テンプレート ディレクティブの debug パラメーターが正しく指定されていない場合に発生します。 このメッセージは、テンプレート ディレクティブの行番号を示します。 |
デバッグ パラメーターを "true" または "false" に設定します。 |
| 無効な HostSpecific 値 '{0}' がテンプレート ディレクティブで指定されました。 HostSpecific 値は、"true" または "false" である必要があります。 既定値の "false" が使用されます。 |
template ディレクティブ内のホスト固有のパラメーターが正しく指定されていない場合に発生します。 このメッセージは、テンプレート ディレクティブの行番号を示します。 |
ホスト固有のパラメーターを "true" または "false" に設定します。 |
| 'template' ディレクティブで無効な言語 '{0}' が指定されました。 言語は 、"C#" または "VB" である必要があります。 既定値の "C#" が使用されます。 |
template ディレクティブでサポートされていない言語が指定されている場合に発生します。 "C#" または "VB" のみが許可されます (大文字と小文字は区別されません)。 このメッセージは、テンプレート ディレクティブの行番号を示します。 |
テンプレート ディレクティブの language パラメーターを "C#" または "VB" に設定します。 |
| テンプレートに複数の出力ディレクティブが見つかりました。 1 つ目以外はすべて無視されます。 | テンプレート ファイルで複数の output ディレクティブが指定されている場合に発生します。 このメッセージは、重複する出力ディレクティブの行番号を示します。 |
重複する output ディレクティブを削除します。 |
| テンプレートに複数のテンプレート ディレクティブが見つかりました。 1 つ目以外はすべて無視されます。 テンプレート ディレクティブに対する複数のパラメーターは、1 つのテンプレート ディレクティブ内で指定する必要があります。 | テキスト テンプレート ファイル (インクルード ファイルを含む) 内で複数の template ディレクティブを指定すると発生します。 このメッセージは、重複するテンプレート ディレクティブの行番号を示します。 |
異なる template ディレクティブを 1 つの template ディレクティブに集約します。 |
| '{0}' という名前のディレクティブにプロセッサが指定されませんでした。 ディレクティブは無視されます。 |
custom ディレクティブを指定したが、processor属性を指定しない場合に発生します。 このメッセージは、ディレクティブの名前と行番号を示します。 |
ディレクティブのプロセッサdirectiveの名前を持ったprocessor属性を指定します。 |
| '{0}' という名前のプロセッサが、'{1}' という名前のディレクティブに対して見つかりませんでした。 ディレクティブは無視されます。 |
directive ディレクティブ内で指定したcustom プロセッサがシステムで見つからない場合に発生します。 このメッセージは、ディレクティブ名、プロセッサ名、およびディレクティブの行番号を提供します。 |
ディレクティブの processor 属性をディレクティブ プロセッサの名前に設定します。 |
| ディレクティブ '{0}' に必要なパラメーター '{1}' が見つかりませんでした。 ディレクティブは無視されます。 | システムが必須のディレクティブ パラメーターを提供しない場合に発生します。 このメッセージは、不足しているパラメーターの名前、ディレクティブ名、および行番号を提供します。 | 不足しているパラメーターを指定します。 |
| '{0}' という名前のプロセッサは、'{1}' という名前のディレクティブをサポートしていません。 ディレクティブは無視されます。 | ディレクティブ プロセッサがディレクティブをサポートしていない場合に発生します。 このメッセージは、問題のあるディレクティブの名前と行番号と、ディレクティブ プロセッサの名前を提供します。 | ディレクティブの名前を修正します。 |
| ファイル '{0}' のインクルード ディレクティブにより、無限ループが発生します。 | 循環インクルード ディレクティブが指定されている場合に表示されます (たとえば、ファイル A にはファイル A を含むファイル B が含まれます)。 | 循環インクルード ディレクティブは指定しないでください。 |
| 変換の実行: | 変換の実行中に生成されるすべてのエラーまたは警告の先頭にこの文字列を付加します。 | 適用されません。 |
| ブロック内で予期しない開始タグまたは終了タグが見つかりました。 開始タグまたは終了タグを誤って入力していないことを確認し、テンプレートに入れ子になったブロックがないことを確認します。 | 予期しない <# または #>がある場合に表示されます。 つまり、閉じていない別の開いているタグの後に <# がある場合、またはその前に閉じていない開いているタグがないときに #> がある場合です。 このメッセージは、不一致のタグの行番号を示します。 | 一致しない開始タグまたは終了タグを削除するか、エスケープ文字を使用します。 |
ディレクティブが正しくない形式で指定されました。 ディレクティブは無視されます。 指示を<#@ name [parametername="parametervalue"]* #>の形式で指定してください |
ディレクティブが正しい形式で指定されていない場合、パーサーによって表示されます。 このメッセージは、正しくないディレクティブの行番号を示します。 | すべてのディレクティブが <#@ name [parametername="parametervalue"]* #>の形式であることを確認します。 詳細については、「 T4 テキスト テンプレート ディレクティブ」を参照してください。 |
| 登録済みディレクティブ プロセッサ '{0}' のアセンブリ '{1}' を読み込めませんでした {2} |
ディレクティブ プロセッサをホストによって読み込めなかった場合に発生します。 このメッセージは、ディレクティブ プロセッサに指定されたアセンブリとディレクティブ プロセッサの名前を識別します。 | ディレクティブ プロセッサが正しく登録されていること、およびアセンブリが存在することを確認します。 |
| 登録済みディレクティブ プロセッサ '{0}' のアセンブリ '{1}' に型 '{2}' が見つかりませんでした {3} |
ディレクティブ プロセッサ型をアセンブリから読み込めなかった場合に発生します。 このメッセージは、型、アセンブリ、ディレクティブ プロセッサの名前を提供します。 | vshost は、レジストリ内のディレクティブ プロセッサ情報 (名前、アセンブリ、および型) を検索します。 ディレクティブ プロセッサが正しく登録されていること、および型がアセンブリに存在することを確認します。 |
| アセンブリ '{0}' の読み込み中に問題が発生しました | アセンブリの読み込みに問題がある場合に発生します。 このメッセージは、アセンブリの名前を示します。 | <@#assembly#> ディレクティブやディレクティブ プロセッサを使用して読み込むアセンブリを指定できます。 この文字列の後に続くエラー メッセージでは、アセンブリの読み込みに失敗した理由に関するより多くのデータが提供されます。 |
| '{1}' という名前のディレクティブのプロセッサの作成と初期化に問題が発生しました。 プロセッサの種類が {0}。 ディレクティブは無視されます。 | システムがディレクティブ プロセッサを作成または初期化できなかった場合に発生します。 このメッセージは、ディレクティブの名前と行番号、およびプロセッサの型を示します。 | 正しいディレクティブ プロセッサを使用し、ディレクティブ プロセッサにパブリックな既定のコンストラクターがあることを確認してください。 それ以外の場合は、デバッグ オプションを使用して、ディレクティブ プロセッサの Initialize() メソッドが失敗する理由を確認します。 詳細については、「 テキスト テンプレートのトラブルシューティング」を参照してください。 |
| '{0}' という名前のディレクティブの処理中に例外がスローされました。 | ディレクティブ プロセッサがディレクティブの処理中に例外をスローしたときに発生します。 | ディレクティブ プロセッサのパラメーターが正しいことを確認してください。 |
| アセンブリの参照 '{0}' を解決しようとしたときに、ホストが例外をスローしました。 | アセンブリ参照を解決しようとしたときにホストが例外をスローすると発生します。 このメッセージは、アセンブリ参照文字列を提供します。 | アセンブリ参照は、 <@#assembly#> ディレクティブおよびディレクティブ プロセッサから取得されます。 アセンブリ パラメーターで指定された 'name' パラメーターが正しいことを確認してください。 |
| サポートされていない値 '{0}' をディレクティブ {2} に対して{1}指定しようとしています。 | サポートされていない requires または provides 引数を指定すると、RequiresProvidesDirectiveProcessor (生成されたすべてのディレクティブ プロセッサがそこから派生) によって発生します。 | 必須パラメーターと指定パラメーターで指定された name='value' ペアの名前が正しいことを確認してください。 |