T4模板在解决方案中添加现有项目的组件

时间:2013-06-06 12:31:59

标签: c# t4

您好我需要在我的T4模板文件的解决方案中添加现有项目的程序集。 问题是我的T4模板在一个名为Project.WebApi的项目中,我在T4模板中需要的类位于名为Project.Common.WebApi的项目中。

我试过像这样导入命名空间:

<#@ import namespace="Project.Common.WebApi.T4TemplateAttribute" #>

但是我收到了这个错误:

  

找不到类型或命名空间名称“Project”(您是否缺少using指令或程序集引用?)

我尝试添加这样的程序集:

<#@ assembly name="Project.Common.WebApi" #>

我收到了这个错误:

  

编译转换:无法找到元数据文件“Project.Common.WebApi”

我的包含T4Template(Project.WebApi)的项目引用了Project.Common.WebApi,但是从我读到的内容来看,T4Template不使用项目中的引用。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:74)

T4几乎完全独立于其他代码。但是,您使用assembly指令正确,但是您需要指定程序集的实际DLL的完整路径,除非程序集在GAC中(它可能不是)。

幸运的是,您可以在T4指令中使用MSBuild宏。所以,你可能会得到像

这样的东西
<#@ assembly name="$(SolutionDir)Project.Common.WebApi\bin\Debug\Project.Common.WebApi.dll" #>

有关此语法的更多背景信息,请参阅MSDN

您还需要import namespace指令。

最后,要警惕项目构建顺序。包含T4模板的项目现在依赖于Project.Common.WebApi,因此您需要确保首先构建Project.Common.WebApi。否则,您的T4模板可能会意外链接到较旧版本的程序集,从而使错误很难跟踪。

如果您已经有一个项目引用,那么您已经完成了所有工作,但是否则您需要正确设置依赖项。您可以通过“Project Dependencies ...”对话框在Visual Studio中执行此操作。右键单击项目以找到它。

答案 1 :(得分:26)

如果您的T4模板项目直接引用该项目,您可以使用 $(TargetDir)

&lt;#@ assembly name =“$(TargetDir)Project.Common.WebApi.dll”#&gt;

答案 2 :(得分:19)

<#@ assembly name="$(TargetPath)" #>

就这么简单。

答案 3 :(得分:-1)

如果您使用的是C#,请使用double slash \\

我认为会是这样的:

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\\bin\\Debug\\Project.Common.WebApi.dll" #>