2(3)关于T4模板的问题,获取正在处理的主文件的名称,并能够结束处理?

时间:2010-11-07 20:09:16

标签: .net visual-studio-2010 t4 dsl

我正在尝试为项目创建自己的DSL,并且我想创建一个包含主要引擎的T4文件,然后创建包含此引擎的小T4文件并调用它。

我正在考虑为将调用引擎的T4文件尝试这种格式:

<#@ include file="EngineLib\EngineLib.tt" #>
<# RunEngine(); #>
dsl goes here

我提出的三个问题如下:

1。我可以获取主脚本的名称吗?

基本上,在EngineLib.tt中,我可以检索包含它的脚本的完整路径和文件名,在这种情况下,脚本如上所示?或者,如果没有,它的内容?

2。我可以结束脚本处理吗?

例如,在RunEngine()方法中,如果第一个问题产生答案,我会读完原始脚本,删除包含T4指令的第一行,然后根据我的处理文件的其余部分DSL规则。

然后,当RunEngine从该DSL产生代码结果时,我将终止T4代码的处理,因此DSL本身不会作为生成文件的一部分输出。

这有意义吗?

假设RunEngine只输出一个类,如果我无法终止处理,这就是生成的文件的样子:

public class SomeClass
{
}
dsl goes here

显然,我不想将DSL代码作为生成输出的一部分。

3。我吠叫错了树吗?

我知道我不能在DSL中包含类似T4的代码,因为这最终会被编译成代码,这些代码将作为T4处理的一部分运行,但在这种情况下它不会成为问题。

我还没有想到的其他任何事情都可能出错?

1 个答案:

答案 0 :(得分:5)

  1. 要获取脚本的名称,请使用Host.TemplateFile。要使主机可用,请将hostspecific属性添加到标题:

    <#@ template language="C#v3.5" hostspecific="true" debug="true" #>
    
  2. 要停止处理脚本,可以使用return语句。显然,在另一个函数中没有办法做到这一点,你必须在<# #>括号内进行。

    <# return GenerationEnvironment.ToString(); #>
    
  3. 您尝试实现的目标通常是使用两个单独的文件:T4脚本和它用作源的数据文件。要在更改数据文件时更新生成的脚本文件,并从一个T4脚本生成多个文件,您可以使用T4Toolbox。