逐步解說:偵錯存取模型的文字範本
當您修改或新增網域特定語言解決方案中的文字範本時,當引擎將範本轉換成原始程式碼或編譯產生的程式碼時,可能會發生錯誤。 下列逐步解說示範您可以執行的一些動作來偵錯文字範本。
注意
如需一般文字範本的詳細資訊,請參閱程式碼產生和 T4 文字範本。 如需偵錯文字範本的詳細資訊,請參閱逐步解說:偵錯文字範本。
建立特定領域語言方案
在此程序中,您會建立具有下列特性的網域特定語言解決方案:
名稱:DebuggingTestLanguage
解決方案範本:最低語言
副檔名: .ddd
公司名稱:Fabrikam
如需建立特定領域語言解決方案的詳細資訊,請參閱如何:建立特定領域語言解決方案。
建立文字範本
將文字範本新增至您的解決方案。
建立文字範本
建置方案,並開始在偵錯工具中執行。 (在 [建置] 功能表,按一下 [重建方案],然後在 [偵錯] 功能表上,按一下 [開始偵錯]。)Visual Studio 的新執行個體會開啟偵錯專案。
將名為
DebugTest.tt
的文字檔新增至偵錯專案。請確定 DebugTest.tt 的 [自訂工具] 屬性已設定為
TextTemplatingFileGenerator
。
從文字範本存取模型的偵錯指示詞
您必須先呼叫產生的指示詞處理器,才能從文字範本中的陳述式和運算式存取模型。 呼叫產生的指示詞處理器,讓模型中的類別可供文字範本程式碼當做屬性使用。 如需詳細資訊,請參閱從文字範本存取模型。
在下列程序中,您將偵錯不正確的指示詞名稱和不正確的屬性名稱。
偵錯不正確的指示詞名稱
以下列程式碼取代 DebugTest.tt 中的程式碼:
注意
程式碼包含錯誤。 您引進錯誤以偵錯錯誤。
<#@ 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 中的程式碼:
注意
程式碼包含錯誤。 您引進錯誤以偵錯錯誤。
<#@ 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
。 您可以在提供的參數中找到正確的屬性名稱,如下列程式碼所示:<#@ 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,然後按一下 [執行自訂工具]。
現在系統會轉換文字範本,並產生對應的輸出檔案。 您將不會在 [錯誤清單] 視窗中看到任何錯誤。