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