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相关推荐

  1. [转]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 ...

  2. 在Visual Studio中使用T4 Templates 生成代码

    在没有看过Hilton Giesenow(How Do I: Create and Use T4 Templates.)的视频之前,我还没意识到在Visual Studio 2008 中使用T4是何等 ...

  3. 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 ...

  4. finereport 登录界面的代码文件_Confluence 6 自定义登录界面

    这个页面将会给你一些如何对 Confluence 登录界面进行自定义的一些建议和知道.这个将不会自定义用户的登录过程,只是对用户看到的登录界面进行自定义. 备注: 自定义过后的 Confluence ...

  5. RIA Service 的 SOAP EndPoint

    原文 www.cyqdata.com/cnblogs/article-detail-39983-english 越来越多的朋友都在使用Silverlight开发应用程序,其中我们常用的还会有一个特殊的 ...

  6. Entity Framework 4 Poco开发之旅 part 2

    在对EF4有一个大致了解后,我们来看看怎么在实际项目中应用EF4和POCO. 1.打开VS2010,新建一个空的解决方案. 2.添加一个Class Library项目,删掉附带的Class1. 3.A ...

  7. 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators

    Microsoft在最新的C#版本中引入了Source Generator.这是一项新功能,可以让我们在代码编译时生成源代码.在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作.然后,您 ...

  8. 【译】微型ORM:PetaPoco

    PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项--单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...

  9. Visual Studio 插件的开发

    Visual Studio 插件的开发 起因 在做项目的时候,经常需要根据表结构create一些实体类,写多了,实在是觉得无趣,于是就琢磨着做个代码生成工具.当然现在有很多现成的,拿来用就好,可是总想 ...

最新文章

  1. jQuery使用之(一)标记元素属性
  2. C# 中的char 和 byte
  3. 跟我一起学.NetCore之路由的最佳实现
  4. mysql主从同步报错_mysql主从同步报错
  5. Jmeter 使用badyboy 录制脚本
  6. iOS和android运存机制,再次确认苹果的1G运存相当于安卓的4G运行内存
  7. BulkRen文件批量改名工具的一点点使用心得
  8. 如何自动申请京东试用商品、签到获取京豆
  9. LPC2478时钟模块详解
  10. 用计算机运算符编写检索式,检索式
  11. react函数式组件传值之子传父
  12. Java:获取两个区间内 为周几或星期符合 的所有日期,指定日期 使用周数计算出相对应的工作日
  13. 使用QT+webassembly构建在线报表设计器
  14. 全屏背景图移动端滚动时白底问题
  15. 元宇宙基础-Three.js | 大帅老猿threejs特训营
  16. 微信小程序拼图游戏(有效果图)
  17. 首次实战Vue高仿移动端QQ音乐项目解析
  18. 汽车电子功能安全标准ISO26262解析(十一)——安全机制
  19. hiho 1082 : 然而沼跃鱼早就看穿了一切
  20. BAT、CMD脚本的编写与实际应用[转]

热门文章

  1. server2008 sql 账号只读权限_SQL Server 2008数据库创建用户只读权限的两种方式(转载)...
  2. 访问云服务器储存的mp4_服务器如何存储视频文件格式
  3. java的八种数据类型_JAVA 的8种基本数据类型
  4. 教学一体机属于计算机的什么应用,教学一体机跟电脑有什么区别 让教学氛围有着更好的教学效果...
  5. matlab激光散斑散射半径测量,激光散斑测量2011412225741
  6. linux写聊天程序,轻易实现基于linux或win运行的聊天服务端程序
  7. mysql fetch rows,php中mysql_fetch_array()和mysql_fetch_rows()函数区别
  8. mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间
  9. MyBatis实现SaveOrUpdate
  10. webService学习2:hello word入门