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

问题描述 投票:0回答:3

我看了一下,但没看到。

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

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

<#@ import namespace="MyProjectA" #>

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

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

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

c# reference t4
3个回答
13
投票

使用

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

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

4
投票

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

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

您也可以通过路径引用 dll。请参阅 Oleg Sych 的 T4 系列,了解几乎所有您想了解的内容。这是有关“程序集”指令的页面:https://web.archive.org/web/20160720100512/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” #>

我不能保证这会起作用,但值得一试。


0
投票

此处给出了从 T4 模板引用程序集的所有方法:T4 模板错误 - 程序集指令无法在 Visual Studio 2010 项目中找到引用的程序集。他们仍然适用于 VS 的更高版本。

如果您想使用@atreeonhill 给出的方法并且想使用其他宏值,那么这里给出了所有 VS 宏:用于构建命令和属性的宏

© www.soinside.com 2019 - 2024. All rights reserved.