T4模板:向解决方案中现有项目添加程序集

50

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

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

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

但我收到了这个错误:

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

我已尝试像这样添加程序集:

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

我遇到了这个错误:

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

包含T4模板(Project.WebApi)的我的项目引用了Project.Common.WebApi,但据我所知,T4模板不使用项目中的引用。

我该怎么解决这个问题?

4个回答

81

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模板可能会意外链接到旧版本的程序集,这将使错误非常难以跟踪。

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


5
应该使用$(ConfigurationName)而不是Debug。 - Nahum

37

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

<#@ assembly name="$(TargetDir)Project.Common.WebApi.dll" #>


这个解决方案对我很有效。T4和DLL必须在同一个项目中,或者包含T4的项目引用DLL项目以便复制。 - Andrea

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

就是这么简单。


好的,简短的解决方案! - Ivan Kochurkin
这个简单多了,你可以开始了:) - Bartosz

-1

如果你正在使用C#,请使用双斜杠\\

我认为应该是这样的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接