次の方法で共有


T4 テキスト テンプレートのデバッグ

テキスト テンプレートにブレークポイントを設定できます。 デザイン時テキスト テンプレートをデバッグするには、テキスト テンプレート ファイルを保存し、ソリューション エクスプローラーでファイルのショートカット メニューを開き、 [T4 テンプレートのデバッグ] をクリックします。 実行時テキスト テンプレートをデバッグするには、属するアプリケーションを単純にデバッグします。

テキスト テンプレートをデバッグするには、テンプレート変換プロセスのステップを理解している必要があります。 発生するエラーの種類はステップごとに異なります。 各ステップは次のとおりです。

手順 デザイン時テンプレート: 発生する時期 実行時テンプレート: 発生する時期
テキスト テンプレートからコードが生成されます。

ディレクティブのエラー、または、一致していないか順序が間違っている <#...#> タグ。
テンプレートを保存するとき、または、テキスト変換を呼び出すとき。 テンプレートを保存するとき、または、テキスト変換を呼び出すとき。
生成されたコードがコンパイルされます。

テンプレート コードのコンパイル エラー。
前の手順の直後。 アプリケーション コードと並んで。
コードが実行されます。

テンプレート コードの実行時エラー。
前の手順の直後。 アプリケーションがテンプレート コードを実行し呼び出したとき。

ほとんどの場合、エラー報告には、テンプレート コード内の行番号が表示されます。 エラー報告が一時ファイル名を指している場合は、一般的な原因として、テキスト テンプレートのコードで使用されている角かっこの対応関係が正しくない可能性があります。

テキスト テンプレートにブレークポイントを設定して、通常の方法でデバッグできます。

一般的なエラーと修正

最も一般的なエラーとその解決方法を次の表に示します。

エラー メッセージ 説明 解決策
Transformation クラスが継承する基底クラス '{0}' を読み込めませんでした。 template ディレクティブの inherits パラメーターに指定された基底クラスが見つからない場合に発生します。 メッセージには、template ディレクティブの行番号が示されます。 指定されたクラスが存在すること、および、そのクラスを含んでいるアセンブリが assembly ディレクティブに指定されていることを確認します。
ファイルのインクルード テキストを解決できませんでした: {0} インクルードされたテンプレートが見つからない場合に発生します。 メッセージには、要求されたインクルード ファイルの名前が示されます。 ファイル パスが元のテンプレート パスからの相対パスで指定されていること、ホストに登録されている場所にファイルが存在すること、またはファイルへの完全パスが指定されていることを確認します。
変換オブジェクトの初期化中にエラーが生成されました。 変換は実行されません。 変換クラスの 'Initialize()' が失敗したか、false を返した場合に発生します。 Initialize() 関数のコードは、<#@template#> ディレクティブに指定された基本変換クラスとディレクティブ プロセッサから与えられます。 初期化の失敗を引き起こしたエラーが、エラー一覧に表示されている可能性があります。 失敗した原因を調査してください。 テンプレートのデバッグ手順に従うと、実際に生成された Initialize() のコードを確認できます。
ディレクティブ プロセッサ '{1}' のアセンブリ '{0}' には、FullTrust アクセス許可セットが適用されませんでした。 信頼されたアセンブリだけがディレクティブ プロセッサを指定できます。 このディレクティブ プロセッサは読み込まれません。 ディレクティブ プロセッサを含んでいるアセンブリに対して、システムから FullTrust アクセス許可が付与されない場合に発生します。 メッセージには、アセンブリの名前とディレクティブ プロセッサの名前が示されます。 ローカル コンピューターで、信頼されたアセンブリだけが使用されていることを確認します。
パス '{0}' は、このコンピューターに対してローカルであるか、または信頼済みゾーンの一部でなければなりません。 ディレクティブまたは assembly ディレクティブによって参照されているファイルが、ローカル コンピューターにも、ネットワークの信頼済みゾーンにも存在しない場合に発生します。 ディレクティブまたは assembly ディレクティブの置かれているディレクトリが信頼済みゾーンにあることを確認します。 Internet Explorer を使用すると、信頼済みゾーンにネットワーク ディレクトリを追加できます。
"無効なトークン 'catch'" や "名前空間にメンバーを直接含めることはできません" など、複数の構文エラーが発生する場合 テンプレート コードに存在する右中かっこ (}) が多すぎます。 コンパイラで標準の生成コードと区別することができません。 コード区切り記号の内側にある右中かっこと右角かっこの数を確認します。
ループまたは条件が適切にコンパイルまたは実行されません。 (例: <#if (i>10)#> Number is: <#= i #>)。

このコードは、常に値 i を出力します。 "Number is:" のみが条件です。
C# では、制御ステートメントに埋め込むテキスト ブロックを必ず中かっこで囲みます。 中かっこを追加します。<#if (i>10) { #> Number is: <#= i #><# } #>
デザイン時テンプレートの処理時または実行時 (前処理された) テンプレートのコンパイル時に "式が複雑すぎます" と表示されます。

実行時テンプレートによって生成されたコードを調べようとすると、Visual Studio が動作を停止します。
テキスト ブロックが長すぎます。 T4 は、テンプレートの行ごとに 1 つのリテラル文字列を使用して、テキスト ブロックを文字列連結式に変換します。 テキスト ブロックが非常に長い場合、コンパイラのサイズ制限を超える可能性があります。 次のような式ブロックで長いテキスト ブロックを分割します。

<#= "" #>

警告の説明と解決方法

最も一般的な警告とその解決方法 (ある場合) を次の表に示します。

警告メッセージ 説明 解決策
インクルード ファイル '{0}' の読み込みで null または空の文字列が返されました。 インクルードされたテキスト テンプレート ファイルが空の場合に発生します。 メッセージには、インクルード ファイルの名前が示されます。 include ディレクティブを削除するか、ファイルが空でないことを確認します。
変換をコンパイルしています: 変換のコンパイル時、コンパイラから生成されるエラーまたは警告にはすべて、先頭にこの文字列が追加されます。 この文字列は、コンパイラによってエラーまたは警告がスローされたことを意味します。 DLL が見つからない問題が発生する場合は、完全パスまたは厳密な完全修飾名 (DLL が GAC に存在する場合) の指定が必要である可能性があります。
パラメーター '{0}' は既にディレクティブに存在します。 重複するパラメーターは無視されます。 1 つのディレクティブの中で同じパラメーターが複数回指定された場合に発生します。 メッセージには、パラメーターの名前とディレクティブの行番号が示されます。 重複するパラメーターの指定を削除します。
インクルード ファイル '{0}' を読み込むときにエラーが発生しました。 インクルード ディレクティブは無視されます。 include ディレクティブに指定されたファイルが見つからない場合に発生します。 メッセージには、ファイルの名前とディレクティブの行番号が示されます。 インクルード ファイルが元のテキスト テンプレートと同じディレクトリ内に存在すること、またはホストに登録されているインクルード ディレクトリのいずれかに存在することを確認します。
無効な基底クラスが Transformation クラスに指定されました。 基底クラスは Microsoft.VisualStudio.TextTemplating.TextTransformation から派生しなければなりません。 template ディレクティブの inherits パラメーターに指定されたクラスが TextTransformation を継承するクラスでない場合に発生します。 メッセージには、template ディレクティブの行番号が示されます。 TextTransformation から派生するクラスを指定します。
無効なカルチャが 'template' ディレクティブに指定されました。 カルチャは "xx-XX" 形式でなければなりません。 インバリアント カルチャが使用されます。 template ディレクティブのカルチャ パラメーターが間違って指定されている場合に発生します。 メッセージには、template ディレクティブの行番号が示されます。 カルチャ パラメーターを "xx-XX" 形式の有効なカルチャに変更します。
無効なデバッグ値 '{0}' がテンプレート ディレクティブに指定されました。 デバッグ値は "true" または "false" でなければなりません。 既定の "false" が使用されます。 template ディレクティブの debug パラメーターが間違って指定されている場合に発生します。 メッセージには、template ディレクティブの行番号が示されます。 debug パラメーターを "true" または "false" に設定します。
無効な HostSpecific 値 '{0}' がテンプレート ディレクティブに指定されました。 HostSpecific 値は "true" または "false" でなければなりません。 既定の "false" が使用されます。 template ディレクティブのホスト固有パラメーターが間違って指定されている場合に発生します。 メッセージには、template ディレクティブの行番号が示されます。 ホスト固有パラメーターを "true" または "false" に設定します。
無効な言語 '{0}' が 'template' ディレクティブに指定されました。 言語は "C#" または "VB" でなければなりません。 既定値の "C#" が使用されます。 template ディレクティブにサポート外の言語が指定されている場合に発生します。 指定できるのは "C#" または "VB" だけです。大文字と小文字は区別されません。 メッセージには、template ディレクティブの行番号が示されます。 template ディレクティブの language パラメーターを "C#" または "VB" に設定します。
出力ディレクティブがテンプレートに複数見つかりました。 最初の 1 つ以外はすべて無視されます。 テンプレート ファイルに複数の output ディレクティブが指定されている場合に発生します。 メッセージには、重複する output ディレクティブの行番号が示されます。 重複する output ディレクティブを削除します。
テンプレートに複数のテンプレート ディレクティブが見つかりました。 最初の 1 つ以外はすべて無視されます。 テンプレート ディレクティブに対する複数のパラメーターは、1 つのテンプレート ディレクティブ内に指定する必要があります。 1 つのテキスト テンプレート ファイル (インクルードされたファイルも含む) 内に複数の template ディレクティブを指定した場合に発生します。 メッセージには、重複する template ディレクティブの行番号が表示されます。 異なる template ディレクティブを 1 つの template ディレクティブにまとめます。
プロセッサがディレクティブ '{0}' に指定されませんでした。 ディレクティブは無視されます。 custom 属性を指定せずに processor ディレクティブを指定した場合に発生します。 メッセージには、ディレクティブの名前と行番号が示されます。 processor 属性に、ディレクティブの directive プロセッサの名前を指定します。
ディレクティブ '{1}' のプロセッサ '{0}' が見つかりませんでした。 ディレクティブは無視されます。 directive ディレクティブ内に指定された custom プロセッサがシステムで見つからない場合に発生します。 メッセージには、ディレクティブ名、プロセッサ名、およびディレクティブの行番号が示されます。 ディレクティブの processor 属性をディレクティブ プロセッサの名前に設定します。
ディレクティブ '{1}' に必須パラメーター '{0}' が見つかりませんでした。 ディレクティブは無視されます。 システムから必須のディレクティブ パラメーターが提供されない場合に発生します。 メッセージには、不足しているパラメーターの名前、ディレクティブ名、および行番号が示されます。 不足しているパラメーターを指定します。
プロセッサ '{0}' はディレクティブ '{1}' をサポートしません。 ディレクティブは無視されます。 ディレクティブ プロセッサがディレクティブをサポートしていない場合に発生します。 メッセージには、ディレクティブ プロセッサの名前と共に、問題となっているディレクティブの名前と行番号が示されます。 ディレクティブの名前を修正します。
ファイル '{0}' のインクルード ディレクティブによって無限ループが発生します。 循環する include ディレクティブが指定された場合に表示されます (たとえば、ファイル A にファイル B がインクルードされ、ファイル B にファイル A がインクルードされている場合が該当します)。 循環する include ディレクティブを指定しないようにします。
変換を実行しています: 変換の実行中に生成されるエラーまたは警告にはすべて、先頭にこの文字列が追加されます。 適用不可。
ブロック内に予期しない開始タグまたは終了タグが見つかりました。 開始タグまたは終了タグの入力に誤りがないこと、および入れ子になっているブロックがテンプレートにないことを確認します。 予期しない <# または #> が存在する場合に表示されます。 対応する終了タグの前に別の <# があるか、または、#> の前に対応する開始タグが存在しないことが考えられます。 メッセージには、対応していないタグの行番号が示されます。 対応していない開始タグまたは終了タグを削除するか、エスケープ文字を使用します。
ディレクティブが正しくない形式で指定されました。 ディレクティブは無視されます。 ディレクティブは <#@ name [parametername="parametervalue"]* #> という形式で指定してください。 ディレクティブが正しい形式で指定されていない場合にパーサーによって表示されます。 メッセージには、誤りのあるディレクティブの行番号が示されます。 ディレクティブがすべて <#@ name [parametername="parametervalue"]* #> という形式で指定されていることを確認します。 詳細については、「T4 テキスト テンプレートのディレクティブ」を参照してください。
登録されたディレクティブ プロセッサ '{1}' のアセンブリ '{0}' を読み込めませんでした

{2}
ディレクティブ プロセッサをホストが読み込めなかった場合に発生します。 メッセージには、ディレクティブ プロセッサに指定されたアセンブリと、ディレクティブ プロセッサの名前が示されます。 ディレクティブ プロセッサが正しく登録され、アセンブリが存在することを確認します。
登録されたディレクティブ プロセッサ '{2}' のアセンブリ '{1}' で型 '{0}' が見つかりませんでした

{3}
ディレクティブ プロセッサの型をそのアセンブリから読み込めなかった場合に発生します。 メッセージには、型の名前、アセンブリ、およびディレクティブ プロセッサが示されます。 vshost は、レジストリからディレクティブ プロセッサ情報 (名前、アセンブリ、および型) を検索します。 ディレクティブ プロセッサが正しく登録され、アセンブリに型が存在することを確認します。
アセンブリ '{0}' の読み込みで問題が発生しました アセンブリの読み込みに問題がある場合に発生します。 メッセージには、アセンブリの名前が示されます。 読み込むアセンブリは <@#assembly#> ディレクティブおよびディレクティブ プロセッサで指定できます。 この文字列の後に続くエラー メッセージに、アセンブリの読み込みに失敗した理由についての詳細なデータが表示されます。
ディレクティブ '{1}' のプロセッサを作成および初期化しているときに問題が発生しました。 プロセッサの型は {0} です。 ディレクティブは無視されます。 システムがディレクティブ プロセッサを作成または初期化できなかった場合に発生します。 メッセージには、ディレクティブの名前と行番号、およびプロセッサの型が示されます。 正しいディレクティブ プロセッサを使用していること、および、そのディレクティブ プロセッサにパブリックな既定のコンストラクターが存在することを確認します。 それ以外には、デバッグ オプションを使用して、ディレクティブ プロセッサの Initialize() メソッドが失敗する理由を調べます。 詳細については、テキスト テンプレートのトラブルシューティングに関するページを参照してください。
ディレクティブ '{0}' の処理中に例外がスローされました。 ディレクティブの処理中にディレクティブ プロセッサから例外がスローされた場合に発生します。 ディレクティブ プロセッサに対するパラメーターが正しいことを確認します。
アセンブリ参照 '{0}' を解決しようとしているときに、ホストが例外をスローしました。 ホストがアセンブリの参照を解決しようとしているときに例外をスローした場合に発生します。 メッセージには、アセンブリ参照文字列が示されます。 アセンブリ参照は <@#assembly#> ディレクティブとディレクティブ プロセッサによって作成されます。 アセンブリ パラメーターに指定された 'name' パラメーターが正しいことを確認します。
ディレクティブ {2} にサポートされていない {1} 値 '{0}' を指定しようとしています。 サポートされていない requires 引数または provides 引数を指定した場合に、RequiresProvidesDirectiveProcessor (すべてのディレクティブ プロセッサの派生元) によって表示されます。 requires パラメーターおよび provides パラメーターに指定された name='value' ペアの名前が正しいことを確認します。