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

原文地址:https://www.cnblogs.com/zhiguzhidao/p/6510464.html