如何在当前项目中已存在的 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 文本模板中使用自定义库/项目?您需要使用"程序集"指令引用 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 模板时为您提供很多帮助,主要是因为它清楚地突出显示了"结果代码"(即模板输出)和"生成代码"(模板内的代码)之间的视觉差异。他们提供免费版本以及商业完整版本。我使用免费版本,到目前为止它真的很有帮助。