【问题标题】:T4 templates error: loading the include file ef.utility.cs.ttinclude returned a null or empty stringT4 模板错误:加载包含文件 ef.utility.cs.ttinclude 返回 null 或空字符串
【发布时间】:2011-11-10 11:33:13
【问题描述】:

here 所述,我已覆盖控制器生成 T4 模板 (ControllerWithContext.tt)。
我想利用在 POCO 模型生成器 T4 模板中使用的 EF.utility.CS.ttinclude 中的代码帮助实用程序。因此,我将以下几行从我的Model.tt 复制到我的ControllerWithContext.tt

<#@ include file="EF.Utility.CS.ttinclude"#>

但是,当我尝试添加控制器时,我收到了错误消息

加载包含文件 'EF.utility.CS.ttinclude' 返回 null 或空字符串

根据MSDN documentation,这个错误是因为包含的文件是空白的,这显然不是因为它适用于Model.tt

我能看到的唯一区别是被覆盖的ControllerWithContext.tt 没有定义自定义工具,而Model.tt 将其设置为TextTemplatingFileGenerator

我的解决方法是将我需要的函数从ef.utility.cs.ttinclude 复制到我的ControllerWithContext.tt 中,这本身会引发更多错误,但很容易解决。

如何在未定义自定义工具的情况下包含 T4 模板?

【问题讨论】:

    标签: c# visual-studio-2010 t4


    【解决方案1】:

    遵循@DustinDavis 的建议,并使用OlegSych's site 上的宝贵信息,我做了以下工作:

    • 创建了一个名为 CodeGenerationTools 的新项目。
    • 添加了对

      的项目引用
      • System.Data.Entity.Design
      • EnvDTE
      • System.Data.Entity
      • Microsoft.VisualStudio.TextTemplating.10.0

      对于最后一个参考,我必须安装正确版本的 Visual Studio SDK

    • 已将 EF.Utility.CS.ttinclude 文件复制到项目中。
    • 将其重命名为 CodeGenerationTools.cs
    • 编辑文件并将所有&lt;#@ import namespace="&lt;name&gt;" #&gt;转换为using &lt;name&gt;;
    • 删除了开闭&lt;#+ #&gt;
    • 添加了指令using Microsoft.VisualStudio.TextTemplating;
    • 扩展类:

      public class CodeGenerationTools : TextTransformation
      
    • 覆盖TransformText 方法

      public override string TransformText() {
          throw new NotImplementedException();
      }
      
    • 添加了空构造函数

      public CodeGenerationTools() {
          _textTransformation = DynamicTextTransformation.Create(this);
          _code = new CSharpCodeProvider();
          _ef = new MetadataTools(_textTransformation);
          FullyQualifySystemTypes = false;
          CamelCaseFields = true;
      }
      
    • 最后,构建这个项目。

    接下来的步骤发生在主项目中 - 编辑了 T4 模板文件。 - 将模板指令更改为

        <#@ template language="C#" HostSpecific="True" debug="false" inherits="CodeGenerationTools"#>
    

    - 添加指令

        <#@ assembly name="C:\Visual Studio 2010\Projects\CodeGenerationTools\CodeGenerationTools\bin\Debug\CodeGenerationTools.dll" #>
        <#@ import namespace="CodeGenerationTools" #>
    

    所有这些现在意味着我可以在我自己的 T4 模板中使用 EF.Utility.CS.ttinclude 中的辅助方法,并且我可以添加自己的辅助方法,这些方法可用于所有项目。

    【讨论】:

      【解决方案2】:

      如果您有 Visual Studio 2012 或 2013,请安装 this EF tool 以解决错误。

      【讨论】:

      • 你的回答救了我。真的感谢您的帮助。你必须是答案#1
      • 对我来说仍然是问题
      【解决方案3】:

      答案是模板处理器甚至没有尝试获取包含文件(使用 ProcMon 确认)。您可以使用任何模板复制此内容,而不仅仅是 EF.Utility.CS.ttinlcude

      不确定为什么需要这些代码,但您始终可以构建自己的基类,只需从 Microsoft.VisualStudio.TextTemplating.TextTransformation 继承它,然后将所有代码放入 EF.Utility 文件中即可。然后将继承指令设置为指向您的新基类,然后您可以从模板访问这些方法。

      【讨论】:

      • 谢谢。正如我所提到的,我想在我自己的 T4 模板中利用 ef.utility.cs.ttinclude 中的 CodeGenerationTools 类。
      • 只要按照我的建议就可以了,只是不要使用包含(至少现在是这样,因为它似乎被破坏了)
      • @DustinDavis:你是说&lt;#@ include file="..." #&gt; 根本不起作用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多