【问题标题】:How do I use custom library/project in T4 text template?如何在 T4 文本模板中使用自定义库/项目?
【发布时间】:2015-04-02 05:54:25
【问题描述】:

我看,我没看到。

我有一个包含两个项目的解决方案——项目 A(一个库)和项目 B,它是主项目并包含 T4 文本模板。

到目前为止我所做的——我在主项目中添加了对项目 A 的引用。我在模板中包含了这样的行:

<#@ import namespace="MyProjectA" #>

然而,仍然出现错误“编译转换:找不到类型或命名空间名称'MyProjectA'(您是否缺少 using 指令或程序集引用?)”

问题:如何从文本模板中引用项目 A?

请注意:我想引用解决方案中的一个项目,而不是磁盘上的 dll 文件。

【问题讨论】:

    标签: c# reference t4


    【解决方案1】:

    使用 $(SolutionDir) 通过 bin 文件夹中的 dll 引用项目(由于它如何解析程序集名称,只能使用 t4)

    <#@ assembly name="$(SolutionDir)MyProject\bin\Applications.Models.dll" #>
    

    (Mel 使用 Path.GetDirectoryName 的上述解决方案不起作用,所以我想分享一下我的经验)

    【讨论】:

      【解决方案2】:

      您还需要使用“程序集”指令来引用 DLL。例如:

      <#@ assembly name=“System.Xml” #>
      

      您也可以通过路径引用 dll。请参阅 Oleg Sych 的 T4 系列,了解几乎所有您想知道的内容。这是关于“汇编”指令的页面:http://www.olegsych.com/2008/02/t4-assembly-directive/

      恐怕 T4 模板完全不知道它所在的解决方案,但是,在解决方案中引用另一个项目仍然必须作为 dll 引用来完成。如果您在“模板”指令中设置 HostSpecific 属性,如下所示:

      <#@ template language="C#" debug="false" hostspecific="true" #>
      

      那么你至少应该能够创建到另一个 dll 的相对路径,尽管我自己没有尝试过这个特定的技巧。您可以使用 Host.TemplateFile 属性获取当前 T4 文件的路径。试试用这个来构造dll引用,如:

      <#@ assembly name=Path.GetDirectoryName(Host.TemplateFile) + “..\OtherProject\bin\Debug\ClassLibrary1.dll” #>
      

      我不能保证这会奏效,但值得一试。

      【讨论】:

      • 谢谢,从博客上的解释我得出结论,汇编指令只是参考的替代品(例如,您可以仅包含一个模板的汇编),我认为 T4 可以看到参考.
      • 'hostspecific' 和 'Path.GetDirectoryName' 可以通过 '$(SolutionDir)' 避免,请参阅 link。遗憾的是,没有更清洁的解决方案可以在文本生成时自动构建引用的项目,如果它发生了变化。
      【解决方案3】:

      此处提供了从 T4 模板引用程序集的所有方法:T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project。他们仍然适用于更高版本的 VS。

      如果你想使用@atreeonhill 给出的方法并且你想使用其他一些宏值,那么这里给出了所有的VS宏:Macros for Build Commands and Properties

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多