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

本文关键字:文本 T4 引用 项目 存在 | 更新日期: 2023-09-27 18:35:21

我正在尝试使用 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 类。

任何帮助将不胜感激。

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

这类似于我过去看到的另一个问题(如何在 T4 文本模板中使用自定义库/项目?您需要使用"程序集"指令引用 DLL。例如:

<#@ assembly name=“System.Xml” #>

若要从自己的项目或解决方案引用 DLL,可以使用相对路径,但首先必须在"template"指令中设置 HostSpecific 属性,如下所示:

<#@ template language="C#" debug="false" hostspecific="true" #>

然后,可以使用 $(SolutionDir) 宏获取解决方案的根目录,并从那里构造到 DLL 的相对路径,如下所示:

<#@ assembly name="$(SolutionDir)'MyOtherProject'bin'Debug'MyOtherAssembly.dll” #>

我强烈建议您将所有公共类(即将在 T4 和 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 编辑器,

例如有形 T4 编辑器,它将在编辑 T4 模板时为您提供很多帮助,主要是因为它清楚地突出显示了"结果代码"(即模板输出)和"生成代码"(模板内的代码)之间的视觉差异。他们提供免费版本以及商业完整版本。我使用免费版本,到目前为止它真的很有帮助。