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)将启动项目配 ...
随机推荐
- java.lang.Long 类源码解读
总体阅读了Long的源码,基本跟Integer类类似,所以特别全部贴出源码,直接注释进行理解. // final修饰符 public final class Long extends Number i ...
- 解决导出CSV后在EXCEL打开纯数字前面0丢失问题
select ip ,concat('="',accountname,'"')select ip ,concat('="',accountname,'"')
- mybatis入门篇:存储过程的操作
1.无ResultType/ResultMap查询 先定义一个查询的存储过程: DELIMITER // CREATE PROCEDURE `select_user_by_id`( IN userId ...
- Revit 命令添加下拉框
在学习revit制作下拉框时,需要分为三个步骤: 1.创建一个面板(panel). RibbonPanel panel10 = application.CreateRibbonPanel(Global ...
- java Page分页显示
//entity层实体类 import java.util.List; //分页展示 //相关属性:当前页,页大小(每页显示的条数),总页数,总条数,数据 //select * from t_user ...
- Vue初接触 stage1
开始学Vue辣!哈哈哈哈哈真的好好玩啊Vue!这个写法我真的太爱了! stage1 4-27 先写一下安装Vue devtools时遇到的问题(说来神奇,我是写第一个实例的时候试着在控制台打印了这个空 ...
- Git上传本地代码
Git add .将本地文件上传至缓冲区 git commit -m 'project init' 将代码上传至本地仓库 Git push 将本地的代码传至线上(码云) git ...
- C++_注释、枚举、typedef
#include<iostream> //using namespace std; int main() { /* ************************************ ...
- pycharm中运行成功的python代码在jenkin中运行问题总结
我们在用selenium+python完成了项目的UI自动化后,一般用jekins持续集成工具来定期运行,python程序在pycharm中编辑运行成功,但在jenkins中运行失败的两个问题,整理如 ...
- easyUI 学习
)省份-城市-区域三级联动[struts2 + ajax +非数据库版] (1)省份-城市-区域,基于jQuery的AJAX三级联动,用Struts2整合AJAX[非数据库版] $.ajax( { t ...