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)将启动项目配 ...
随机推荐
- Postman 中上传图片的接口怎么做参数化呢?
如题求教,麻烦回复在评论里,不胜感激~
- Spring @Autowired注解在非Controller中注入为null
问题描述 今天在写一个工具类,里面用了@Autowired注入了StringRedisTemplate以及RedisTemplate时,在template.opsForValue().set(key, ...
- 如何安装MySQL5.5.62
1.首先进入官网https://www.mysql.com MySQL分为社区版和商业版,社区版是免费的,这里选择社区版的. 2.此时选择一个比较简单的5.5版本 直接下载Wisndow(X86,32 ...
- JMETER之socket接口性能测试
公司的**产品经过换代升级,终于要上线了,纯java编码,包括POS(PC/安卓平板)版.WEB版.微信版,各终端通过 Webservice服务共享数据资源,因此Webservice各接口的性能测试就 ...
- tensorflow 如何读取npy文件里的参数
import numpy as npc = np.load( "vgg16.npy" ) #npy的文件名x = c.item() #此时,x的type是一个字典nam ...
- springboot性能优化
一.扫描优化 原文链接:http://www.studyshare.cn/blog-front/blog/details/1135 SpringBoot项目中的启动类,会使用@SpringBootAp ...
- EMQTT本地源码搭建填坑记录
因业务需求需要本地搭建一个emqtt的消息队列服务器,根据官网提示搭建失败,具体如下 官方步骤: Erlang 安装: http://www.erlang.org/ MSYS2 安装: http:// ...
- C#使用List实现类似RadioButtonGroup的单选功能
首先说说需求,有多种不同类型的UserControl用于以不同的方式显示数据,想通过在另一个view中实现某种点击选中按钮后,在数据显示view中,只让被逻辑关联的UserControl显示(Visi ...
- vue实例
<!--需求: 背景图片,进度条,减和重置按钮 进度条填满红色,值为100%,点击减时,进度条依次减十,减到0时换一张背景图片,减按钮消失,点击重置按钮时,进度条重新填满红色-->效果图: ...
- Java简单操作dubbo(一)
dubbo-service公共Service package com.itman.service; public interface UserService { // 提供服务 使用userId查找用 ...