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

ale*_*dru 46 c# t4

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

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

<#@ import namespace="Project.Common.WebApi.T4TemplateAttribute" #>
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

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

我试过像这样添加程序集:

<#@ assembly name="Project.Common.WebApi" #>
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

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

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

我该如何解决这个问题?

skr*_*bel 78

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

但幸运的是,您可以在T4指令中使用MSBuild宏.所以,你可能会得到类似的东西

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

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

你还需要这个import namespace指令.

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

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

  • 也应该是$(ConfigurationName)而不是Debug (4认同)
  • 它应该是`$(SolutionDir)Project ...`而不是`$(SolutionDir)\ Project ...`因为`$(SolutionDir)`已经附加了反斜杠. (2认同)

czl*_*tea 28

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

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


mit*_*ess 21

<#@ assembly name="$(TargetPath)" #>
Run Code Online (Sandbox Code Playgroud)

就如此容易.