我看,我没看到。
我有一个包含两个项目的解决方案 - 项目A(库)和项目B,它是主项目,包含T4文本模板。
到目前为止我做了什么 - 我在项目A的主项目中添加了一个参考。我在模板中包含了这样的一行:
<#@ import namespace="MyProjectA" #>
然而,仍然存在错误“编译转换:找不到类型或命名空间名称'MyProjectA'(您是否缺少using指令或程序集引用?)”
问题:如何从文本模板引用项目A?
请注意:我想在解决方案中引用一个项目,而不是磁盘上的dll文件。
答案 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