T4 Template Overview
T4 Template Overview
T4 Template的组成
指令区:为模板转换引擎提供指令,控制模板如何被处理
- template:模板相关的属性,debug是否可以调试;hostspecific设置为true时,为生成的模板类中添加Host属性
- output:生成输出文件类型
- assembly:模板引擎中引用的程序集
- import:模板引擎中导入的命名空间
- include:包含其他文件,在最终转换时,将这些引用的文件和当前文件进行合并
代码控制区
- 标准代码控制区,<#...#>包围的区域,包含标准的代码
- 表达式控制区,<#=...#>包围的区域,计算表达式的值,插入到最终输出文件中
- 类特性控制区,<#+...#>包围的区域,定义类、属性、方法等,主要用于帮助类或者帮助方法,可以其他代码区域引用这里定义的类和方法,该区域中包含的代码可以放在单独文件中,然后include到当前文件中
T4 工具方法
- Write,WriteLine:向模板中写入数据文本
- Error,在VS的Error Window面板显示错误
- Warning,在VS的Error Window面板显示警告
更多方法,请参考:http://msdn.microsoft.com/en-us/library/bb126474.aspx
Host属性:引用模板转换引擎的宿主
- Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost类型
- 使用Host.ResolvePath()引用相对于模板的路径
- 使用Host.LogErrors打印错误信息,如果宿主是VS的话,就是向Error Window打印错误警告信息
- 如果是在VS中使用,可以访问VS的API
建议的开发流程
- T4模板不是编写代码的理想环境(没有智能提示等)
- 首先在其他工程中实现模板需要的功能
- 将工程的代码迁移到T4模板中
如何Debug T4模板
- 首先建议采用上面说的开发流程,T4模板的Debug是用来解决迁移过程中出现的问题
- template指令设置debug="true“
- 添加断点
- 在模板文件中右键Debug T4 Template
T4 Template的三个组件
引擎
如何生成GeneratedTextTransformation
GeneratedTextTransformation运行
使用自定义的TextTransformation
GeneratedTextTransformation继承自TextTransformation,如果要使用另外一套方法集,可以定义继承自TextTransformation的类,然后在template指令的inherits属性指定为该类
宿主
- 加载引擎或者指令处理器需要的文本文件或者二进制文件,比如加载程序集、指令处理器代码文件,也可以读取文本文件,将它们的内容作为字符串返回
- 为引擎创建GeneratedTextTransformation类提供一组标准的程序集和命名空间
- 为引擎编译和执行GeneratedTextTransformation类提供AppDomain,使用独立的AppDomain是为保护宿主应用程序(VS)不受模板文件中错误的影响
- 将生成的结果写入输出文件
- 为生成的输出文件设置默认扩展名
- 处理文件转换过程中出现的错误,比如写入文件中,又比如VS将错误显示到Error Window中
- 为指令提供默认值,比如language默认值C#
自定义宿主
创建并运行自己的工程,引用Microsoft.VisualStudio.TextTemplating.11.0.dll和Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll,主要是使用Engine的ProcessTemplate
更详细流程请参考官方文档:http://msdn.microsoft.com/en-us/library/bb126579.aspx
指令处理器
- 提供公共功能,访问外部资源或数据
- 引擎将指令转换为代码,添加到GeneratedTextTransformation中,比如Import指令最终添加为using代码语句
自定义指令处理器:
需要创建继承自DirectiveProcessor或者RequiresProvidesDirectiveProcessor的类,该类的重要接口如下
- bool IsDirectiveSupported(string directiveName)支持哪些指令,只有返回true的指令名称,才会进行下一步的处理
- void ProcessDirective (string directiveName, IDictionary<string, string> arguments)处理指令时,引擎调用这个方法,一般是将指令名称和参数保存下来为后面的操作做准备
- string[] GetReferencesForProcessingRun()返回模板需要的程序集名称
- string[] GetImportsForProcessingRun()返回模板需要的命名空间
- string GetClassCodeForProcessingRun()向GeneratedTextTransformation类中插入的实际代码,定义了公共功能如属性、方法等的代码
部署指令处理器
- Visual Studio Extension (VSIX)
- VSPackage
- 注册表
详细部署流程,请参考官方文档:http://msdn.microsoft.com/en-us/library/cc138364.aspx
参考文档和资料
http://msdn.microsoft.com/en-us/library/bb126445.aspx
http://www.cnblogs.com/artech/archive/2010/11/16/T4_Assembly_Locking_Debug.html
http://www.cnblogs.com/artech/archive/2010/10/23/1859529.html
http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx
T4 Template Overview的更多相关文章
- [转] How to generate multiple outputs from single T4 template (T4 输出多个文件)
本文转自:http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/ Updat ...
- 用T4 Template生成代码
1 T4语法 T4的语法与ASP.NET的方式比较类似.主要包括指令.文本块.控制块. 1.1 指令 指令主要包括template, output, assembly, import, incl ...
- 把旧系统迁移到.Net Core 2.0 日记(9) -- T4 Template
想着用T4 Template 自动生成代码,省了功夫. 发现T4 Template 挺笨的. 我开始这样写是会报错的 <# var modualName = "CRM" ...
- 使用微软T4 template进行代码生成
使得软件工程高效开发的主要方法是复用.复用的宗旨是提高设计的内聚性,主要包括:函数,类,模式,组件,框架等等.而有些应用场景并都是可以直接拿来现成代码使用的,有时代码库的代码不是那么容易修改,或者根本 ...
- 【Reship】use of tangible T4 template engine
1.first of all 之前在 “使用T4模板生成代码 – 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “Multipl ...
- t4 template multi file output
1.Manager.ttinclude <#@ assembly name="System.Core"#> <#@ assembly name="Sys ...
- CSharpGL(12)用T4模板生成CSSL及其renderer代码
CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...
- [转]Multiple outputs from T4 made easy
本文转自:http://damieng.com/blog/2009/01/22/multiple-outputs-from-t4-made-easy One of the things I wante ...
- T4 assembly
In a T4 template the executing assembly is not yours but one from the T4 engine. To access types fro ...
随机推荐
- 模拟linux下的ls -l命令
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- SQL Server编程系列(1):SMO介绍
原文:SQL Server编程系列(1):SMO介绍 续篇:SQL Server编程系列(2):SMO常用对象的有关操作 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己 ...
- 【足迹C++primer】47、Moving Objects(1)
Moving Objects(1) * 功能:Moving Objects * 时间:2014年7月17日08:46:45 * 作者:cutter_point */ #include<iostr ...
- 【SSH三个框架】Hibernate第十篇基础:inverse属性具体解释
inverse后经常用于双向1-N在相关性.它也可以在使用N-N该协会,这里,例如用双1-N联想 或两个与各部门及工作人员,两javabean没有写. 首先,我们的员工看映射文件: <?xml ...
- HTML解析利器-HtmlAgility学习
原文:HTML解析利器-HtmlAgility学习 HtmlAgility是一个开源的Html解析库,据说是C#版的JQuery,功能非常强大. 该篇学习它的解析功能,还可以模拟用户请求,创建html ...
- 汽车之家购买价格PC真正的原因阿拉丁
网行业风起云涌,先是6月3号汽车之家天价竞购百度PC阿拉丁.接着今天又有消息说易车拿下百度移动阿拉丁.易车拿下百度移动阿拉丁能够想象.但PC阿拉丁被向来不屑流量购买,以自主流量自居的汽车之家拿 ...
- zoj 3822 Domination(dp)
题目链接:zoj 3822 Domination 题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望. 解题思路:大白书上概率那一张有一 ...
- 推荐几个靠谱的VPN
最近开发scala程序使用sbt构建工程时,下载很慢,有些依赖只能通过VPN才能下载下来.在网上搜索了一大堆提供VPN服务的.有一大部分不提供试用,而且还必须得按年购买,看起来是像骗子. 在这里推荐几 ...
- 讲故事的人写的谈判手册——Leo锦书64
正如其名称所暗示这本书"谈判无处不在".从决定谈判的成功或失败的因素一个不同的观点,测量中详细给出的同一时间. 图书出版不错,这是阅读的样车.阅读收获压力较小的方式. 书能给读 ...
- VMware安装CentOS 图文教程
VMware安装CentOS 图文教程 VMware 下安装CentOS6.2 取消 Easy install模式(此模式不好,很多软件没有安装) http://jingyan.baidu.com/a ...