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
转载于:https://blog.51cto.com/hamu01/1343402
T4 Template Overview相关推荐
- [转]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 ...
- 在Visual Studio中使用T4 Templates 生成代码
在没有看过Hilton Giesenow(How Do I: Create and Use T4 Templates.)的视频之前,我还没意识到在Visual Studio 2008 中使用T4是何等 ...
- What’s New in Entity Framework 4? API Changes(1)(转)
If you have been working with the ADO.NET Entity Framework, you have probably been extremely eager t ...
- finereport 登录界面的代码文件_Confluence 6 自定义登录界面
这个页面将会给你一些如何对 Confluence 登录界面进行自定义的一些建议和知道.这个将不会自定义用户的登录过程,只是对用户看到的登录界面进行自定义. 备注: 自定义过后的 Confluence ...
- RIA Service 的 SOAP EndPoint
原文 www.cyqdata.com/cnblogs/article-detail-39983-english 越来越多的朋友都在使用Silverlight开发应用程序,其中我们常用的还会有一个特殊的 ...
- Entity Framework 4 Poco开发之旅 part 2
在对EF4有一个大致了解后,我们来看看怎么在实际项目中应用EF4和POCO. 1.打开VS2010,新建一个空的解决方案. 2.添加一个Class Library项目,删掉附带的Class1. 3.A ...
- 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators
Microsoft在最新的C#版本中引入了Source Generator.这是一项新功能,可以让我们在代码编译时生成源代码.在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作.然后,您 ...
- 【译】微型ORM:PetaPoco
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项--单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...
- Visual Studio 插件的开发
Visual Studio 插件的开发 起因 在做项目的时候,经常需要根据表结构create一些实体类,写多了,实在是觉得无趣,于是就琢磨着做个代码生成工具.当然现在有很多现成的,拿来用就好,可是总想 ...
最新文章
- jQuery使用之(一)标记元素属性
- C# 中的char 和 byte
- 跟我一起学.NetCore之路由的最佳实现
- mysql主从同步报错_mysql主从同步报错
- Jmeter 使用badyboy 录制脚本
- iOS和android运存机制,再次确认苹果的1G运存相当于安卓的4G运行内存
- BulkRen文件批量改名工具的一点点使用心得
- 如何自动申请京东试用商品、签到获取京豆
- LPC2478时钟模块详解
- 用计算机运算符编写检索式,检索式
- react函数式组件传值之子传父
- Java:获取两个区间内 为周几或星期符合 的所有日期,指定日期 使用周数计算出相对应的工作日
- 使用QT+webassembly构建在线报表设计器
- 全屏背景图移动端滚动时白底问题
- 元宇宙基础-Three.js | 大帅老猿threejs特训营
- 微信小程序拼图游戏(有效果图)
- 首次实战Vue高仿移动端QQ音乐项目解析
- 汽车电子功能安全标准ISO26262解析(十一)——安全机制
- hiho 1082 : 然而沼跃鱼早就看穿了一切
- BAT、CMD脚本的编写与实际应用[转]
热门文章
- server2008 sql 账号只读权限_SQL Server 2008数据库创建用户只读权限的两种方式(转载)...
- 访问云服务器储存的mp4_服务器如何存储视频文件格式
- java的八种数据类型_JAVA 的8种基本数据类型
- 教学一体机属于计算机的什么应用,教学一体机跟电脑有什么区别 让教学氛围有着更好的教学效果...
- matlab激光散斑散射半径测量,激光散斑测量2011412225741
- linux写聊天程序,轻易实现基于linux或win运行的聊天服务端程序
- mysql fetch rows,php中mysql_fetch_array()和mysql_fetch_rows()函数区别
- mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间
- MyBatis实现SaveOrUpdate
- webService学习2:hello word入门