T4設計時模板調試


      在Visual Studio內調試T4設計時模板有多個方法:安裝使用帶調試功能的第三方工具,利用System.Diagnostics.Debugger實時調試器,VS內置的T4調試工具。使用第三方工具的方法就不用說了,這里只記錄下使用Debugger實時調試器和VS內置的T4調試工具的調試過程。首先是使用VS內置調試工具的調試過程。此處的VS使用的VS2015專業版,在VS內新建一個文本模板TextTemplate1.tt,刪掉不必要的部分,代碼如下:

<#@ template debug="false" hostspecific="false" language="C#" #>
<# 
    var a=1;
    var b=2;
    var c="3";
 #>

一.使用VS內置的T4調試工具

直接引述官網說明

  • 將 debug="true" 插入 template 指令。 例如:

    <#@ template debug="true" hostspecific="false" language="C#" #>

  • 在模板中使用為普通代碼設置斷點的相同方式設置斷點。

  • 在“解決方案資源管理器”中,從文本模板文件的快捷菜單選擇“調試 T4 模板”。

對於dubug=“true”還做了特別說明:

debug="true" 使生成的代碼更精確地映射到文本模板,方法是在生成的代碼中插入更多行號指令。 如果不使用它,斷點可能在錯誤狀態下停止運行。

但是,即使不在進行調試,你仍可將該子句留在模板指令中。 這僅會使性能下降一點點。

說的很清楚,直接測試,測試方法在var c=“3”代碼行設置斷點,在解決方案里找到TextTemplate1.tt右鍵點擊調試T4模板,系統正常中斷:

可以看到c是null,點擊單步調試直接結束,也就是使用這種方法變量c是無法調試的,也就是T4代碼最后一行是沒法監視的,要調試最后一行需要在其后再加一行才可以。上面截圖可以看到debug改為了true,實際測試時debug=“false”也可以中斷,介於上面代碼太簡單,我在一個利用excel數據庫設計表生成數據庫實體類的T4模板上進程了測試,在debug=“false”時也沒有遇到中斷異常,所以等以后遇到再補充。

二。使用System.Diagnostics.Debugger實時調試器

 使用System.Diagnostics.Debugger實時調試器進行調試時調用的Debugger方法有兩個:

         System.Diagnostics.Debugger.Launch()用來打開一個調試器並中斷。

         System.Diagnostics.Debugger.Break()在調試器中加一個斷點,相當於代碼行前的那個小紅點。

使用Launch()打開實時調試器並將T4代碼載入調試器內進行調試,並在實時調試器首次打開時中斷,實時調試器已打開時Launch()不起作用,使用Break()下斷。需要說明的是使用System.Diagnostics.Debugger必須將T4模板debug特性設置為“true”以在實時調試器內加載調試符號,否則不會正常中斷。測試T4代碼如上,調試過程如下:

1.設置T4模板debug特性為“true”,此時完整代碼如下;

2.此時開始第一次調試,注意第一次,使用System.Diagnostics.Debugger.Launch()打開一個調試器,第一次打開調試器Launch()處也會中斷,所以可以這樣寫:

<#@ template debug="true" hostspecific="false" language="C#" #>
<# 
var a=1;
var b=2;
var c="3";
System.Diagnostics.Debugger.Launch();
 #>

點擊保存或者“Ctrl-S”(自定義T4在保存時執行),此時彈出一個實時調試器選擇對話框(我電腦里裝了vs2010和vs2015):

選擇VS2015,再點擊是,然后就會重新打開一個VS2015作為實時調試器,解決方案名稱為“devenv”,在這個新的VS2015內T4代碼已中斷在System.Diagnostics.Debugger.Launch();添加變量監視可以看到三個變量內容:

黃色箭頭及代碼行黃色背景代表當前中斷位置,接下來單步、繼續等調試方法就和普通代碼調試完全一樣了。

3.如要修改代碼,則在兩個VS2015內修改都是有效的,切換時VS會自動提示同步,點擊全部是就可以重新加載修改后代碼。但是調試觸發(保存操作)只在原有VS2015內有效,在新VS2015內點擊保存不會中斷。

4.在新VS2015內點擊“繼續”結束本次調試,保持新VS2015打開,僅修改代碼a=1為a=4,點擊保存再次調試此時System.Diagnostics.Debugger.Launch()不會中斷,由於當前有新VS2015作實時調試器,也不會再打開新調試器,系統完全沒有中斷。

5.修改Launch()為Break(),點擊保存新VS2015內再次中斷:

使用實時調試器調試,在T4編碼調試完成前實時調試器不需要關閉,不小心關了Launch()會再重新打開,所在在實際使用時可以直接在T4代碼開始處添加一個System.Diagnostics.Debugger.Launch()

<#@ template debug="true" hostspecific="false" language="C#" #>

<# 
System.Diagnostics.Debugger.Launch();
var a=4;
var b=2;
var c="3";
System.Diagnostics.Debugger.Break();
 #>

 尾聲

  有了方法一干嘛還用方法二?答:當模板文件是.tt類型時方法一很方便,但.t4類型的卻用不了,方法二的都能用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM