在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类型的却用不了,方法二的都能用。