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

gre*_*man 7 c# t4 reference

我看,我没有看到.

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

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

<#@ import namespace="MyProjectA" #>
Run Code Online (Sandbox Code Playgroud)

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

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

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

atr*_*eon 10

使用$(SolutionDir)引用通过bin文件夹的dll项目(仅适用于T4的方式,由于它如何解决程序集名称)

<#@ assembly name="$(SolutionDir)MyProject\bin\Applications.Models.dll" #>
Run Code Online (Sandbox Code Playgroud)

(Mel使用Path.GetDirectoryName的上述解决方案没有工作,所以以为我会分享我的经验)


Mel*_*Mel 4

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

\n\n
<#@ assembly name=\xe2\x80\x9cSystem.Xml\xe2\x80\x9d #>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
<#@ template language="C#" debug="false" hostspecific="true" #>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
<#@ assembly name=Path.GetDirectoryName(Host.TemplateFile) + \xe2\x80\x9c..\\OtherProject\\bin\\Debug\\ClassLibrary1.dll\xe2\x80\x9d #>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n