如何在当前项目的T4文本模板中引用已经存在的类?

4

我正在尝试使用T4模板自动生成一些代码来使用在我的项目中。我从小处开始,以便更好地了解,并且这是我目前拥有的。

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject\bin\Debug\MyProject.exe" #>
namespace KY_ADJRATE_CLAIM
{
    public class OutboundClaim
    {
<#
    ClaimConfig cc;
 #>
    }
}

我尝试过这个

<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject\bin\Debug\MyProject.exe" #>

并且这个

<#@ assembly name="MyProject.exe" #>

但每次我尝试创建一个类的实例时,都会出现以下错误信息:

命名空间不能直接包含字段或方法等成员。 编译转换:找不到类型或命名空间名称“ClaimConfig”(是否缺少 using 指令或程序集引用?)

我的目标是通过 T4 模板访问项目中的 ClaimConfig 类。

非常感谢您提供任何帮助。

2个回答

7
这与我以前见过的另一个问题相似(如何在T4文本模板中使用自定义库/项目?)。你需要使用"assembly"指令引用DLL文件。例如:
<#@ assembly name=“System.Xml” #>

为了从您自己的项目或解决方案引用DLL,您可以使用相对路径,但首先需要在“模板”指令中设置HostSpecific属性,如下所示:
<#@ template language="C#" debug="false" hostspecific="true" #>

您可以使用 $(SolutionDir) 宏来获得解决方案的根目录,并从那里构造一个相对路径到 DLL,如下所示:
<#@ assembly name="$(SolutionDir)\MyOtherProject\bin\Debug\MyOtherAssembly.dll” #>

1
或者尝试:<#@ assembly name="$(TargetPath)" #> - Pedro OS

5

我强烈建议您将所有通用类(即在T4内部和外部都会使用的类)分开放置在一个公共程序集中,然后通过引用该程序集来为您的项目和T4模板提供支持:

 MySolution
 |
 | -> MyProject.Common
 |    |--> ClaimConfig.cs
 | 
 | -> MyProject.Main
 |    |--> References
 |    |    |--> MyProject.Common
 |    | MyT4Template.tt

为了使编译MyProject.Common(其中包含编译主项目和T4模板所需的所有类)分离出来。

然后在您的模板中:

<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject.Common\bin\Debug\MyProject.Common.dll" #>

此外,我强烈建议您使用T4编辑器,比如Tangible T4 Editor,在编辑T4模板时,它将对您有很大帮助,主要是因为它清晰地突出显示并视觉上区分了“生成代码”(即模板输出)和“生成代码”(模板内部的代码)。他们提供免费版本和商业完整版本。我使用的是免费版本,到目前为止非常有帮助。

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