【问题标题】:T4 TextTemplatingFilePreprocessor .tt location at runtimeT4 TextTemplatingFilePreprocessor .tt 在运行时的位置
【发布时间】:2013-03-11 16:13:38
【问题描述】:

我正在编写一个应用程序,它将在客户端计算机(VS 之外)上处理 T4 文件。理想情况下,我想将 .tt 文件嵌入到 dll 中。

我尝试将 Build Action 设置为 Resource,但我注意到预处理的 .cs 文件仍然包含对 .tt 文件的硬编码目录引用。

分发 .tt 文件并在运行时引用它的正确方法是什么?

为了确保我清楚,我希望能够将文件嵌入到 dll 中并作为资源访问,或者在运行时从相对于程序集路径的位置加载文件。

【问题讨论】:

  • 您真的需要分发 .tt 文件吗? .tt 文件被转换为在设计时(预处理)实现 .tt 行为的 c# 类。在运行时,您实例化此 c# 类,为其提供参数并运行转换。如果您将生成的 c# 文件中的 #line pragma 称为“硬编码”文件引用 - 当出现编译错误并且对运行时转换没有影响时,这些有助于在 .tt 文件中查找错误。
  • 好的,所以你说我实际上不需要担心 .tt 文件,因为生成的类?我感到困惑的是 .tt 的内容不在生成的类中,这让我相信 .tt 是必需的。
  • 使用 t4 模板包括两个步骤:第一个步骤是从中生成可编译和可运行的代码类,并由模板引擎完成。在第二步中,此代码类运行并生成输出文本(在您的情况下为 c# 代码,也许这就是它令人困惑的原因)。该引擎不是 Visual Studio 的可再分发部分,这就是您在分发模板时使用预处理模板的原因。预处理的模板会生成该代码类,该代码类稍后会编写您的输出代码。根据您之前的 t4 代码,此类包含大量“写入”命令。
  • 如果您可以发表您的最后一条评论作为答案,我可以接受。

标签: t4


【解决方案1】:

您不需要分发 .tt 文件本身。使用 .tt 文件需要两个步骤:

  1. 模板引擎将模板转换为一些可编译和可运行的代码类。
  2. 运行此代码类并生成输出代码

引擎不是 Visual Studio 的可再分发部分,因此,当您想要分发 t4 模板时,您需要使用预处理模板。这样,第 1 步中生成的代码类将呈现到 t4 模板的 .cs-File 中,编译并与您的程序集一起提供。

使用t4模板编写C#代码时可能会让人感到困惑,因为第1步的代码类也是C#类(当然是在c#项目中)并且包含很多.Write()方法调用这实际上构建了所​​需的输出代码。

预处理模板包含以#line 开头的行,后跟T4 模板文件的本地和绝对路径。这些行用于调试目的,当模板引擎在步骤 1 中发现错误时,允许 Visual Studio 在 .tt 文件中显示正确的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多