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

ang*_*son 3 .net dsl t4 visual-studio-2010

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

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

<#@ include file="EngineLib\EngineLib.tt" #>
<# RunEngine(); #>
dsl goes here
Run Code Online (Sandbox Code Playgroud)

我有三个问题如下:

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

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

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

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

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

这有意义吗?

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

public class SomeClass
{
}
dsl goes here
Run Code Online (Sandbox Code Playgroud)

显然我不希望DSL代码作为我生成的输出的一部分.

我在错误的树上吠叫吗?

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

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

Ath*_*ari 5

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

    <#@ template language="C#v3.5" hostspecific="true" debug="true" #>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要停止处理脚本,可以使用returnstatement.显然,没有办法在另一个函数内执行此操作,您必须在<# #>括号内执行此操作.

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