我看,我没有看到.
我有一个包含两个项目的解决方案 - 项目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的上述解决方案没有工作,所以以为我会分享我的经验)
您还需要使用“程序集”指令来引用 DLL。例如:
\n\n<#@ assembly name=\xe2\x80\x9cSystem.Xml\xe2\x80\x9d #>\nRun 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" #>\nRun 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 #>\nRun Code Online (Sandbox Code Playgroud)\n\n我不能保证这会起作用,但值得一试。
\n