共用方式為


逐步解說:偵錯存取模型的文字範本

當您修改或新增網域特定語言解決方案中的文字範本時,當引擎將範本轉換成原始程式碼或編譯產生的程式碼時,可能會發生錯誤。 下列逐步解說示範您可以執行的一些動作來偵錯文字範本。

注意

如需一般文字範本的詳細資訊,請參閱程式碼產生和 T4 文字範本。 如需偵錯文字範本的詳細資訊,請參閱逐步解說:偵錯文字範本

建立特定領域語言方案

在此程序中,您會建立具有下列特性的網域特定語言解決方案:

建立文字範本

將文字範本新增至您的解決方案。

建立文字範本

  1. 建置方案,並開始在偵錯工具中執行。 (在 [建置] 功能表,按一下 [重建方案],然後在 [偵錯] 功能表上,按一下 [開始偵錯]。)Visual Studio 的新執行個體會開啟偵錯專案。

  2. 將名為 DebugTest.tt 的文字檔新增至偵錯專案。

  3. 請確定 DebugTest.tt 的 [自訂工具] 屬性已設定為 TextTemplatingFileGenerator

從文字範本存取模型的偵錯指示詞

您必須先呼叫產生的指示詞處理器,才能從文字範本中的陳述式和運算式存取模型。 呼叫產生的指示詞處理器,讓模型中的類別可供文字範本程式碼當做屬性使用。 如需詳細資訊,請參閱從文字範本存取模型

在下列程序中,您將偵錯不正確的指示詞名稱和不正確的屬性名稱。

偵錯不正確的指示詞名稱

  1. 以下列程式碼取代 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 #>
    <#
    }
    #>
    
  2. [方案總管] 中,以滑鼠右鍵按一下 DebugTest.tt,然後按一下 [執行自訂工具]

    [錯誤清單] 視窗會顯示此錯誤:

    名為 'DebuggingTestLanguageDirectiveProcessor' 的處理器不支援名為 'modelRoot' 的指示詞。 轉換將不會執行。

    在此情況下,指示詞呼叫包含不正確的指示詞名稱。 您已指定 modelRoot 為指示詞名稱,但正確的指示詞名稱為 DebuggingTestLanguage

  3. 按兩下 [錯誤清單] 視窗中的錯誤,以跳至程式碼。

  4. 若要更正程式碼,請將指示詞名稱變更為 DebuggingTestLanguage

    變更會反白顯示。

    <#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=ExampleModel" #>
    
  5. [方案總管] 中,以滑鼠右鍵按一下 DebugTest.tt,然後按一下 [執行自訂工具]

    現在系統會轉換文字範本,並產生對應的輸出檔案。 您將不會在 [錯誤清單] 視窗中看到任何錯誤。

偵錯不正確的屬性名稱

  1. 以下列程式碼取代 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 #>
    <#
    }
    #>
    
  2. [方案總管] 中,以滑鼠右鍵按一下 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" #>
    
  3. 按兩下 [錯誤清單] 視窗中的錯誤,以跳至程式碼。

  4. 若要更正程式碼,請將文字範本程式碼中的屬性名稱變更為 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 #>
    <#
    }
    #>
    
  5. [方案總管] 中,以滑鼠右鍵按一下 DebugTest.tt,然後按一下 [執行自訂工具]

    現在系統會轉換文字範本,並產生對應的輸出檔案。 您將不會在 [錯誤清單] 視窗中看到任何錯誤。