偵錯 T4 文字範本
您可以在文字範本中的中斷點。若要偵錯設計階段文字範本,請選取在文字範本檔的捷徑功能表的 [偵錯 T4 範本] 在方案總管中。若要偵錯執行階段文字範本, Debug 所屬的應用程式。
若要偵錯文字範本,您應該了解範本轉換流程的步驟。不同的錯誤種類可能在每個控制項時發生。步驟如下:
步驟 |
設計階段範本:當發生 |
執行階段範本:當發生 |
---|---|---|
程式碼從文字範本產生。 在指示詞或不相符的或 Scrum 的 <#…#> 標記的錯誤。 |
當您儲存範本或叫用文字轉換。 |
當您儲存範本或叫用文字轉換。 |
產生的程式碼編譯。 編譯錯誤會在範本程式碼。 |
在上一個步驟之後。 |
與您的應用程式程式碼。 |
程式碼執行。 執行階段錯誤會在範本程式碼。 |
在上一個步驟之後。 |
當應用程式執行並叫用樣板程式碼。 |
在大部分情況下,錯誤報告會提供範本程式碼中出現錯誤的行號。當錯誤報告提到暫存檔案名稱時,通常是因為文字範本程式碼中的括弧不對稱所致。
您可以在文字範本的中斷點和偵錯以一般方式。
常見錯誤和固定
下表列出最常見的錯誤和其修正。
錯誤訊息 |
描述 |
解決方案 |
---|---|---|
無法從轉換類別繼承的類別載入基底類別 '{0}'。 |
如果您在範本指示詞中找不到 inherits 參數中指定的基底類別,就會發生。訊息提供範本指示詞的行號。 |
請確定指定的類別存在,並且在組件指示詞中指定它所存在的組件。 |
無法解析檔案:{0} 的包含文字 |
找不到包含的範本時,就會發生。訊息提供所要求的包含檔案的名稱。 |
請確定檔案路徑相對於原始的範本路徑,或者檔案所在的位置已向主機註冊,或者具有檔案的完整路徑。 |
初始化轉換物件時產生錯誤。轉換將不會執行。 |
轉換類別的 'Initialize()' 失敗或傳回 false 時,就會發生。 |
Initialize() 函式中的程式碼來自於 < #@template# > 中所指定的基底轉換類別,以及來自指示詞處理器。導致初始化失敗的錯誤可能會在錯誤清單中。調查失敗的原因。您可以依照下列程序偵錯範本,查看實際產生的 Initialize() 程式碼。 |
指示詞處理器 ' {1}' 的組件 '{0} 未獲得 FullTrust 集合。只有信任的組件可提供指示詞處理器。將不會載入這個指示詞處理器。 |
系統不將 FullTrust 權限授與包含指示詞處理器的組件時,就會發生。訊息提供組件的名稱和指示詞處理器的名稱。 |
要確定您只使用本機電腦上的受信任組件。 |
路徑 '{0}'必須是這台電腦的本機,或者是受信任區域的一部分。 |
當指示詞或組件指示詞參考不在您本機電腦或網路可信任區域中的檔案時,就會發生。 |
請確定指示詞或組件指示詞所在的目錄是受信任的區域。您可以透過 Internet Explorer 在受信任的區域中加入網路目錄。 |
多個語法錯誤,例如 "無效語彙基元擷取" 或 "命名空間不能直接包含成員" |
範本程式碼中有太多右括號。編譯器會混淆它與標準產生程式碼。 |
檢查程式碼分隔符號中左括號及大括號的數目。 |
未正確編譯或執行迴圈或條件。例如:
此程式碼永遠輸出 i 的值。只有「號碼是:」才是條件。 |
在 C# 中,永遠使用大括號括住內嵌於控制陳述式中的文字區塊。 |
加入大括號:
|
處理設計階段範本或編譯執行階段 (預處理) 範本時顯示「運算式太複雜」。 嘗試檢查執行階段範本產生的程式碼時,Visual Studio 停止運作。 |
文字區塊是太長。T4 會將文字區塊轉換為字串串連運算式,而範本的每一行會各有一個字串常值。很長的文字區塊可能會超越編譯器的大小限制。 |
以運算式區塊將冗長的文字區塊分段,例如: <#= "" #> |
警告描述和修正
下表列出最常見的警告和修正 (如果有的話)。
警告訊息 |
描述 |
解決方案 |
---|---|---|
載入包含檔案 '{0}' 傳回 Null 或空字串。 |
如果包含的文字範本檔案是空的,就會發生。訊息會提供包含檔案的檔案名稱。 |
移除包含指示詞,或者確定檔案中具有一些內容。 |
編譯轉換: |
在所有當編譯器編譯轉換時產生的錯誤或警告前加上此字串。此字串表示編譯器擲出錯誤或警告。 |
如果您有問題,尋找 DLL,您可能需要提供完整的路徑或完整的強式名稱,如果 DLL 是在 GAC 中。 |
參數 '{0}' 已經存在於指示詞中。將忽略重複的參數。 |
在指示詞中指定參數一次以上時,就會發生。訊息提供參數的名稱和指示詞的行號。 |
移除重複的參數規格。 |
載入包含檔 '{0}' 時發生錯誤。包含指示詞將會被忽略。 |
找不到 include 指示詞中指定的檔案時,就會發生。訊息提供檔案的名稱和指示詞的行號。 |
請確定包含檔存在於與原始文字範本檔相同的目錄中,或者存在於其中一個於主機註冊的包含目錄中。 |
為轉換類別指定的基底類別無效。基底類別必須衍生自 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"。 |
'範本' 指示詞中指定了不正確的語言值 '{0}'。語言必須是 "C#" 或 "VB"。將使用預設值 "C#"。 |
在 template 指示詞中指定不支援的語言時,就會發生。只允許 "C#" 或 "VB" (不區分大小寫)。訊息提供範本指示詞的行號。 |
將範本指示詞中的 language 參數設定為 "C#" 或 "VB"。 |
在範本中找到多個輸出指示詞。將忽略第一個以外的所有輸出指示詞。 |
在範本檔中指定多個 output 指示詞時,就會發生。訊息會提供重複輸出指示詞的行號。 |
移除重複的 output 指示詞。 |
在範本中找到多個範本指示詞。將忽略第一個以外的所有輸出指示詞。範本指示詞的多個參數應該在一個範本指示詞中指定。 |
如果您在文字範本檔 (包括包含檔) 內指定多個 template 指示詞,就會發生。訊息會提供重複範本指示詞的行號。 |
將不同的 template 指示詞彙總成一個 template 指示詞。 |
名為 '{0}' 的指示詞未指定任何處理器。將忽略指示詞。 |
如果您指定 custom 指示詞,但並不提供 processor 屬性,就會發生。訊息提供指示詞的名稱和行號。 |
提供 processor 屬性,此屬性具有指示詞之 directive 處理器的名稱。 |
名為 '{1}' 的指示詞找不到名為 '{0}' 的處理器。將忽略指示詞。 |
系統找不到您在 custom 指示詞內指定的 directive 處理器時,就會發生。訊息會提供指示詞名稱、處理器名稱和指示詞的行號。 |
將指示詞中的 processor 屬性設定為指示詞處理器的名稱。 |
找不到指示詞 '{1}' 的必要參數 '{0}'。將忽略指示詞。 |
系統不提供必要的指示詞參數時,就會發生。訊息提供遺漏之參數的名稱、指示詞名稱和行號。 |
提供遺漏的參數。 |
名為 '{0}' 的處理器不支援名為 '{1}' 的指示詞。將忽略指示詞。 |
當指示詞處理器不支援指示詞時,就會發生。訊息會提供發生衝突之指示詞的名稱和行號,以及指示詞處理器的名稱。 |
修正指示詞的名稱。 |
檔案 '{0}' 的包含指示詞會造成無限迴圈。 |
如果指定了循環包含指示詞指定 (比方說檔案 A 包括檔案 B,其中包含檔案 A),則會顯示。 |
未指定循環包含指示詞。 |
執行轉換: |
在執行轉換時產生的所有錯誤或警告前加上此字串。 |
不適用。 |
在區塊中發生未預期的開始或結束標記。請確定您沒有拼錯開始或結束標籤,而且您的範本中沒有任何巢狀區塊。 |
會在發生非預期的 <# 或 #> 時顯示。也就是說,如果您在另一個封閉的開放式標記之後加上 < #,或者在該標記之前並沒有非封閉的開放式標記時加上 #>。訊息會提供不相符標記的行號。 |
移除不相符的開始或結束標記,或者使用逸出字元。 |
所指定的指示詞格式錯誤。將忽略指示詞。請指定指示詞的格式<#@ 名稱 [parametername= " parametervalue」] * #> |
如果未以正確的格式指定指示詞,則由分析器顯示。訊息會提供不正確指示詞的行號。 |
請確定所有指示詞在表單<#@ 名稱 [parametername= " parametervalue」] * #>。如需詳細資訊,請參閱T4 文字範本指示詞。 |
無法載入登錄指示詞處理器 ' {1}'的組件 '{0}' {2} |
當主機無法載入指示詞處理器時,就會發生。訊息會識別提供給指示詞處理器的組件,以及指示詞處理器的名稱。 |
請務必正確地登錄指示詞處理器,並確定組件存在。 |
在組件 '{1}' 中找不到登錄指示詞處理器 '{2}' 的 '{0}' {3} |
無法從指示詞處理器的組件載入指示詞處理器型別時,就會發生。訊息提供型別、組件及指示詞處理器的名稱。 |
vshost 會在登錄中尋找指示詞處理器資訊 (名稱、 組件和型別)。請務必正確地登錄指示詞處理器,並確定型別存在於組件中。 |
載入組件 '{0}' 時發生問題 |
載入組件出現問題時,就會發生。訊息提供組件的名稱。 |
您可以指定要在 <@#組件#> 指示詞載入的組件 (依指示詞處理器的順序)。這個字串之後的錯誤訊息應提供關於組件載入失敗原因的詳細資料。 |
建立及初始化名為 '{1}' 的指示詞處理器時發生問題。處理器的類型是 {0}。將忽略指示詞。 |
系統無法建立或初始化指示詞處理器時,就會發生。訊息會提供指示詞的名稱和行號,以及處理器的類型。 |
請務必使用正確的指示詞處理器,並且確定該指示詞處理器具有公用預設建構函式。否則,請使用偵錯選項找出指示詞處理器的 Initialize() 方法失敗的原因。如需詳細資訊,請參閱偵錯 T4 文字範本。 |
處理名稱為 '{0}' 的指示詞時,會擲回例外狀況。 |
當指示詞處理器在處理指示詞時擲回例外狀況,就會發生。 |
請確定指示詞處理器的參數正確無誤。 |
主機嘗試解析組件參考 {0}' 時擲回例外狀況。 |
主機嘗試解析組件參考時,若擲回例外狀況,就會發生。訊息會提供組件參考字串。 |
組件參考來自 <@#assembly#> 指示詞及指示詞處理器。請確定組件參數中提供的 'name' 參數正確無誤。 |
嘗試為指示詞 {2} 指定不受支援的 {1} 值 '{0}' |
當您提供不支援的查詢或提供引數時,會在 RequiresProvidesDirectiveProcessor 發生 (所有產生的指示詞處理器皆衍生自此)。 |
請確定 requires 和 provides 參數中提供的名稱='値' 組中的名稱正確無誤。 |