如何在T4文本模板中使用自定义库/项目?

时间:2011-06-01 09:52:28

标签: c# reference t4

我看,我没看到。

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

到目前为止我做了什么 - 我在项目A的主项目中添加了一个参考。我在模板中包含了这样的一行:

<#@ import namespace="MyProjectA" #>

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

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

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

3 个答案:

答案 0 :(得分:10)

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

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

(Mel使用Path.GetDirectoryName的上述解决方案无效,所以我想分享我的经验)

答案 1 :(得分:4)

您还需要使用“assembly”指令引用DLL。例如:

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

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

我担心T4模板完全没有意识到它所处的解决方案,但是,因此在解决方案中引用另一个项目仍然需要作为dll参考来完成。如果在“template”指令中设置HostSpecific属性,如下所示:

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

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

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

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

答案 2 :(得分:0)

这里给出了从T4模板引用程序集的所有方法:T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project。他们仍然申请VS的更高版本。

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