T4模板在解决scheme中添加现有项目的组装

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

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

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

但是我得到这个错误:

 The type or namespace name 'Project' could not be found (are you missing a using directive or an assembly reference?) 

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

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

我得到这个错误:

 Compiling transformation: Metadata file 'Project.Common.WebApi' could not be found 

我的包含T4Template(Project.WebApi)的项目有一个Project.Common.WebApi的引用,但从我读的T4Template不使用项目中的引用。

我该如何解决这个问题?

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

幸运的是,你可以在T4指令中使用MSBuildmacros。 所以,你可能会得到类似的东西

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

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

您还需要import namespace指令。

最后,要小心项目build立顺序。 包含您的T4模板的项目现在取决于Project.Common.WebApi,所以您需要确保Project.Common.WebApi是首先构build的。 否则,您的T4模板可能会意外链接到较旧版本的程序集,使得错误难以追踪。

如果你已经有了一个项目引用,你就完成了,否则你需要正确设置依赖关系。 您可以通过“Project Dependencies …”对话框在Visual Studio中执行此操作。 右键单击该项目以查找它。

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

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

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

就如此容易。

以防万一您正在使用C#

我认为这将是:

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

使用双斜杠。