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

7

我看了看,但没看到。

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

到目前为止,我已经在主项目中添加了对 A 项目的引用。我在模板中包含了以下行:

<#@ import namespace="MyProjectA" #>

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

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

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

3个回答

13

使用 $(SolutionDir) 可以通过 bin 文件夹中的 dll 引用项目(由于 t4 如何解析程序集名称,这是唯一的方法)

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

4
您需要使用 "assembly" 指令引用 DLL。例如:
<#@ assembly name=“System.Xml” #>

您也可以通过dll文件路径来引用它们。如果您想了解任何相关信息,可以查看Oleg Sych的T4系列文章。以下是关于“assembly”指令的页面链接: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” #>

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


谢谢,通过博客上的解释,我得出结论,汇编指令只是引用的替代品(例如,您可以仅为一个模板包含汇编),而我认为T4可以看到引用。 - greenoldman
1
可以使用“$(SolutionDir)”避免“hostspecific”和“Path.GetDirectoryName”,请参见链接。可惜没有更干净的解决方案,如果引用的项目发生更改,则会自动构建文本生成。 - Emperor Orionii

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接