47

嗨,我需要在我的 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

4 回答 4

79

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 中执行此操作。右键单击该项目以找到它。

于 2013-06-06T13:02:22.283 回答
33

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

<#@ 程序集名称="$(TargetDir)Project.Common.WebApi.dll" #>

于 2014-07-21T16:52:14.860 回答
28
<#@ assembly name="$(TargetPath)" #>

就如此容易。

于 2015-07-21T12:19:45.080 回答
-1

以防万一您使用 C# 使用double slash \\.

我认为它会是这样的:

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\\bin\\Debug\\Project.Common.WebApi.dll" #>
于 2014-12-19T00:06:16.660 回答