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

T4 Template Overview的更多相关文章

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

  2. 用T4 Template生成代码

    1 T4语法 T4的语法与ASP.NET的方式比较类似.主要包括指令.文本块.控制块. 1.1    指令 指令主要包括template, output, assembly, import, incl ...

  3. 把旧系统迁移到.Net Core 2.0 日记(9) -- T4 Template

    想着用T4 Template 自动生成代码,省了功夫. 发现T4 Template 挺笨的. 我开始这样写是会报错的  <#  var modualName = "CRM"  ...

  4. 使用微软T4 template进行代码生成

    使得软件工程高效开发的主要方法是复用.复用的宗旨是提高设计的内聚性,主要包括:函数,类,模式,组件,框架等等.而有些应用场景并都是可以直接拿来现成代码使用的,有时代码库的代码不是那么容易修改,或者根本 ...

  5. 【Reship】use of tangible T4 template engine

    1.first of all 之前在 “使用T4模板生成代码 – 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “Multipl ...

  6. t4 template multi file output

    1.Manager.ttinclude <#@ assembly name="System.Core"#> <#@ assembly name="Sys ...

  7. CSharpGL(12)用T4模板生成CSSL及其renderer代码

    CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...

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

  9. T4 assembly

    In a T4 template the executing assembly is not yours but one from the T4 engine. To access types fro ...

随机推荐

  1. 采用 HTML5 File API 达到client log

    http://www.ibm.com/developerworks/cn/web/1210_jiangjj_html5log/ 版权声明:本文博主原创文章,博客,未经同意不得转载.

  2. 开始学习java

    .net 许久 看网络java猿飞计划,感觉成了少数类,学校为它,有多难不,有着vb,C,javascript和vs基金会,这并不是说一些语法和框架的熟悉做,搞两天,以一个开发环境,myeclipse ...

  3. Java得到的一周的最后一天的一段时间内

    Java得到的一周的最后一天的一段时间内 1.设计源代码 LastDayOfWeek.java: /** * @Title:LastDayOfWeek.java * @Package:com.you. ...

  4. 打破了中国电信华为无线路由猫(HG522-C)自己主动拨号+任意数量的计算机+iTV

    中国电信路由猫去势后总是我的好E家里到处都是卖包(够坏垄断市场.有霸王条款多,例如,他们必须用自己的手机,同时计算机的最大数量的在线等),我曾破获另一家中国电信路由猫.非常easy,由U它磁盘恢复默认 ...

  5. 使用ArcGIS API for Silverlight 进行复合多条件空间查询

    原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询 这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享. 为什么说是复合多条件呢?因为进 ...

  6. jQuery性能优化38建议---最引人注目的用户体验!

    一.需要注意的是的定义jQuery当变量被添加varkeyword 然而,这并不jQuery.整个javascript开发过程,所有需要注意,一定不要将其定义为下面的示例: $loading = $( ...

  7. TRILL浅析

    1 TRILL概述 TRILL的全称就是Transparent Interconnection of Lots of Links,顾名思义,其本质就是将非常多条链路透明地组织在一起,以致于上层IP应用 ...

  8. Android MediaPlayer 和 NativePlayer 播放格式控制

    对于本机MediaPlayer 支持格型式试验: 对于原生 NativeMedia 的支持格式測试: 这个支持就比較失望了,眼下測试的手机仅仅支持 H.264视频及AAC音频,其他的格式都不支持. 使 ...

  9. Web API 2 对 CORS 的支持

    Web API 2 对 CORS 的支持 CORS概念 跨域资源共享 (CORS) 是一种万维网联合会 (W3C) 规范(通常被认为是 HTML5 的一部分),它可让 JavaScript 克服由浏览 ...

  10. Socket 学习(三).4 UDP 穿透 客户端与客户端连接

    效果图: 使用方法:  先 修改WinClient\bin\Debug  下面的 ip.ini,写上 服务器 IP地址. 客户端 与 客户端 通讯 之前 ,点击发送打洞消息 按钮,然后过一会再发送消息 ...