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

C# 如何在T4文本模板中使用自定义库/项目?,c#,reference,t4,C#,Reference,T4,我看不见 我有一个包含两个项目的解决方案——项目a(一个库)和项目B,这是主项目,包含T4文本模板 到目前为止我所做的--我在主项目中添加了对项目a的引用。我在模板中包括了这样一行: <#@ import namespace="MyProjectA" #> 但是,仍然存在错误“编译转换:找不到类型或命名空间名称“MyProjectA”(是否缺少using指令或程序集引用?) 问题:如何从文本模板引用项目 请注意:我希望引用解决方案中的项目,而不是磁盘上的dll文件。您还需要使用

我看不见

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

到目前为止我所做的--我在主项目中添加了对项目a的引用。我在模板中包括了这样一行:

<#@ import namespace="MyProjectA" #>

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

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


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

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

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

您也可以通过DLL的路径引用它们。关于你想知道的任何事情,请参阅Oleg Sych的T4系列。以下是关于“汇编”指令的页面:

我担心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” #>

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

使用
$(SolutionDir)
通过bin文件夹中的dll引用项目(t4的唯一方法是解析程序集名称)



(Mel使用Path.GetDirectoryName的上述解决方案不起作用,因此我想与大家分享我的经验)

此处给出了从T4模板引用程序集的所有方法:。它们仍然适用于VS的更高版本


如果您想使用@atreeonhill给出的方法,并且您想使用其他一些宏值,那么这里给出了所有VS宏:

谢谢,从博客上的解释中,我得出结论,assembly指令只是参考的替代品(例如,您可以只为一个模板包含assembly),我认为引用可以通过T4看到。'hostspecific'和'Path.GetDirectoryName'可以通过'$(SolutionDir)')避免,请参阅。遗憾的是,并没有更干净的解决方案可以在文本生成时自动生成引用的项目(若该项目已更改)。
<#@ assembly name="$(SolutionDir)MyProject\bin\Applications.Models.dll" #>