使用T4 文本模板

从模板读取另一个项目文件。
  • 将 hostSpecific="true" 插入 <#@template#> 指令。
  • 在代码中,使用 this.Host.ResolvePath(filename) 获取文件的完整路径。
从模板调用方法
  • 使用 <#@assembly#> 指令加载程序集,并使用 <#@import#> 设置命名空间上下文。
  • 如果您要编写预处理过的文本模板,则编写与预处理过的文本模板具有相同名称的分部类定义。 将其他方法添加到此类中。
  • 编写类功能控制块 <#+ ... #>,可以在其中声明方法、属性和私有类。 编译文本模板后,它将转换为一个类。 标准控制块 <#...#> 和文本将转换为单个方法,类功能块将作为单独成员插入。 有关更多信息,请参见T4 文本模板控制块
  • 定义为类功能的方法还可以包括嵌入文本块。
  • 请考虑在单独文件中放置类功能,该文件可以 <#@include#> 到一个或多个模板文件中。
  • 在单独程序集(类库)中编写方法并从您的模板调用它们。 使用 <#@assembly#> 指令加载程序集,使用<#@import#> 设置命名空间上下文。 请注意,为了在调试程序集时重新生成该程序集,您可能必须停止并重新启动 Visual Studio。 有关更多信息,请参见 T4 文本模板指令
从一个模型架构生成许多文件
  • 考虑编写指令处理器。 这使您能够在每个具有单一自定义指令的模板中替换多个程序集语句和导入语句 。 指令处理器还可以加载和分析模型文件。 有关更多信息,请参见创建自定义文本模板指令处理器
从 Visual Studio 获取数据
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#
  IServiceProvider serviceProvider = (IServiceProvider)this.Host;
  EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetService(typeof(EnvDTE.DTE));
#>

Number of projects in this VS solution:  <#= dte.Solution.Projects.Count #>


调试模板代码
  • 在 <#@template#> 指令中插入 debug="true",并保存文件。
  • 如果出现异常,则可以逐句通过模板。
  • 普通断点在模板中不起作用,但是您可以插入 System.Diagnostics.Debugger.Launch() 来打开调试器。
  • 如果要检查生成的代码,它将出现在 %TEMP% 目录中。
posted @ 2011-11-18 14:45  抱影无眠  阅读(848)  评论(0编辑  收藏  举报