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=;
var b=;
var c="";
#>
一.使用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=;
var b=;
var c="";
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=;
var b=;
var c="";
System.Diagnostics.Debugger.Break();
#>
尾声
有了方法一干嘛还用方法二?答:当模板文件是.tt类型时方法一很方便,但.t4类型的却用不了,方法二的都能用。
T4设计时模板调试的更多相关文章
- T4学习- 2、创建设计时模板
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的关键 ...
- T4运行时模板
可以通过Visual Studio运行时文本模板在您的应用程序在运行时生成文本字符串. 执行应用程序的计算机不必具有 Visual Studio. 运行库模板有时称为"预处理文本模板&quo ...
- 使用 T4 文本模板生成设计时代码
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...
- T4学习- 3、创建运行时模板
使用 Visual Studio 预处理过的文本模板,可以在运行时在应用程序中生成文本字符串. 执行应用程序的计算机不必具有 Visual Studio. 预处理过的模板有时称为"运行时文本 ...
- [No0000AE]在 Visual Studio 中调试 XAML 设计时异常
在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...
- 在 Visual Studio 中调试 XAML 设计时异常
在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...
- C#winform自定义控件模拟设计时界面鼠标移动和调节大小、选中效果
要想玩转Winform自定义控件需要对GDI+非常熟悉,对常用的控件有一些了解,好选择合适的基类控件来简化. 要点说明及代码 1)定义接口: using System; using System.Wi ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- wpf控件设计时支持(3)
原文:wpf控件设计时支持(3) wpf设计时调试 编辑模型 装饰器 1.wpf设计时调试 为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码 (1)将启动项目配 ...
随机推荐
- 64 位 Windows 平台开发注意要点之注册表重定向
Window 系统错误代码 ERROR_SUCCESS,本博客中一律使用 NO_ERROR 代替.虽然 ERROR_SUCCESS 与 NO_ERROR 是完全等价的,都代表成功,但是后者却和其他错误 ...
- 淘宝App直播宝贝数据采集
淘宝App直播宝贝数据采集 前段时间,有人问我关于淘宝app直播频道宝贝如何采集?我尝试了下可以获取的到,模拟器登录不了淘宝,这里有一个坑就是,模拟器有时候会跳到登录页面,登录不了淘宝: 一.用A ...
- QMap迭代器
QMap<int, QString> intToStr; intToStr[] = "test" for (auto iter = intToStr.begin(); ...
- sqoop 问题以及 小tips
1. Sqoop import 任务里把原来NULL的转化成字符串‘null’了. 解决方法: 先: alter table ${table_name} SET SERDEPROPERTIES('se ...
- Java Native调用C方法
1.通过JNI生成C调用的头文件:Java源码: import java.io.File; public class Test { static { System.load("D:" ...
- JConsole监控Linux上的Tomcat
JConsole监控Linux上的Tomcat 从Java 5开始引入了 JConsole,来监控 Java 应用程序性能和跟踪 Java 中的代码.jconsole是JDK自带监控工具,只需要找到 ...
- 学会使用box-sizing布局
盒子模型 关于CSS重要的一个概念就是CSS盒子模型.它控制着页面这些元素的高度和宽度.盒子模型多少会让人产生一些困惑,尤其当涉及到高度和宽度计算的时候.真正盒子的宽度(在页面呈现出来的宽度)和高度, ...
- Java 8 日期时间 API
转自:https://www.runoob.com/java/java8-datetime-api.html Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与 ...
- EXCEL文本字符串转日期
=IF(ISERROR(DATEVALUE(A2)), A2, DATEVALUE(A2)) 注意ISERROR函数的使用,如果DATEVALUE解析字符串失败,比如单元格数值本来就是日期,会发挥#V ...
- RocketMQ入门(消费者)_3
消费者角色: 1. 推式(一般建议用推式) 2. 拉式 消费模式: 1. 集群(cluster) --均衡负载消费 2. 广播(broadcasting) --发布和订阅 ...