文本模板转换过程
文本模板转换过程将文本模板文件作为输入,生成一个新的文本文件作为输出。 例如,可以使用文本模板生成 Visual Basic 或 C# 代码,还可以生成 HTML 报告。
有三个组件参与这一过程:引擎、宿主和指令处理器。 引擎对该过程进行控制;引擎与宿主和指令处理器交互,以生成输出文件。 宿主提供与环境的所有交互,如定位文件和程序集。 指令处理器添加功能,如从 XML 文件或数据库读取数据。
文本模板转换过程分两步执行。 第一步,引擎创建一个临时类,即生成转换类。 该类包含由指令和控制块生成的代码。 之后,引擎编译和执行该生成转换类,从而生成输出文件。
组件
组件 |
说明 |
可自定义(是/否) |
---|---|---|
引擎 |
引擎组件控制文本模板转换过程 |
不能。 |
主机 |
宿主是引擎与用户环境之间的接口。 Visual Studio 是文本转换过程的宿主。 |
是。 可以编写自定义宿主。 |
指令处理器 |
指令处理器是处理文本模板中的指令的类。 可以使用指令从输入源向文本模板提供数据。 |
是。 可以编写自定义指令处理器 |
引擎
引擎以字符串形式从宿主接收模板,而宿主处理在转换过程中所用的所有文件。 接下来,引擎请求宿主定位所有自定义指令处理器和环境中的其他方面。 然后,引擎编译和运行生成转换类。 引擎将生成的文本返回给宿主,宿主通常将该文本保存到文件中。
宿主
宿主负责转换过程之外与环境有关的所有操作,包括:
查找引擎或指令处理器请求的文本和二进制文件。 宿主可以搜索目录和全局程序集缓存以查找程序集。 宿主可以为引擎查找自定义指令处理器代码。 宿主还可以查找并读取文本文件,然后以字符串形式返回其内容。
提供标准程序集和命名空间的列表,供引擎用于创建生成转换类。
提供引擎在编译和执行生成转换类时所用的应用程序域。 将使用独立应用程序域,以免宿主应用程序受到模板代码错误的影响。
写入生成的输出文件。
设置生成的输出文件的默认扩展名。
处理文本模板转换错误。 例如,宿主可以将错误显示在用户界面中,也可以将错误写入文件。 (在 Visual Studio 中,错误显示在“错误消息”窗口中。)
在用户调用了指令但未提供值时,提供必需的参数值。 指令处理器可以指定指令名称和参数,可以请求宿主提供默认值(如果有)。
指令和指令处理器
指令是文本模板中的命令。 它向生成过程提供参数。 通常,指令定义模型或其他输入的源和类型,以及输出文件的文件扩展名。
指令处理器可以处理一个或多个指令。 转换模板之前,必须安装能够处理模板中的指令的指令处理器。
指令通过向生成转换类添加代码发挥作用。 指令是从文本模板调用的,在创建生成转换类时,引擎会处理所有指令调用。 成功调用某个指令后,文本模板中编写的其他代码就可以使用该指令提供的功能。 例如,可以在模板中对 import 指令进行以下调用:
<#@ import namespace="System.Text" #>
标准指令处理器将此调用转换为生成转换类中的 using 语句。 然后,可以使用其余模板代码中的 StringBuilder 类,而无需将其限定为 System.Text.StringBuilder。