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. 使用 CodeIgniter 框架快速开发 PHP 应用(七)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(七) CodeIgniter 和对象这是玩家章节.它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'.如果 ...

  2. oracle 11g 自己主动调整

    --:自己主动调教计划 begin   dbms_workload_repository.create_snapshot(); end; select /*+ result_cache */ coun ...

  3. EpPlus读取生成Excel帮助类+读取csv帮助类+Aspose.Cells生成Excel帮助类

    大部分功能逻辑都在,少量自定义异常类和扩展方法 ,可用类似代码自己替换 //EpPlus读取生成Excel帮助类+读取csv帮助类,epplus只支持开放的Excel文件格式:xlsx,不支持 xls ...

  4. ssh 综合

    文件夹结构: 搭建项目: 1.创建web项目 2.创建各种包. com.atguigu.surveypark.dao.impl com.atguigu.surveypark.model com.atg ...

  5. 【百度地图API】多家地图API文件大小对比

    原文:[百度地图API]多家地图API文件大小对比 于2011.6.9日更新百度地图API文件大小.同时更新图片. 任务描述: 明天就是元宵佳节啦~这是一个团团圆圆的节日,于是,再次想把各家API聚在 ...

  6. C#中设计Fluent API

    C#中设计Fluent API 我们经常使用的一些框架例如:EF,Automaper,NHibernate等都提供了非常优秀的Fluent API, 这样的API充分利用了VS的智能提示,而且写出来的 ...

  7. Access to the temp directory is denied. Identity 'NT AUTHORITY\NETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss

    造成错误的原因是用bat代码清理系统垃圾时造成的权限丢失而引起的 错误描述 1.An error occurred creating the configuration section handler ...

  8. SQL代理执行EXE可执行程序

    原文:SQL代理执行EXE可执行程序  1.如果没有启用xp_cmdshell安全配置是不可以使用的-- 启用xp_cmdshellEXEC sp_configure 'xp_cmdshell', 1 ...

  9. Oracle OS认证和口令文件认证方法

    OS认证 1.在SQLNET.ORA(位于$ORACLE_HOME/NETWORK/ADMIN文件夹中)文件里,使用vi编辑,凝视掉#SQLNET.AUTHENTICATION_SERVICES = ...

  10. 微信公众平台消息接口开发-封装weixin.class.php

    原文:微信公众平台消息接口开发-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处 ...