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

And*_*ans 4 c# t4 c#-4.0

我正在尝试使用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;
 #>
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过这个

<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject\bin\Debug\MyProject.exe" #>
Run Code Online (Sandbox Code Playgroud)

还有这个

<#@ assembly name="MyProject.exe" #>
Run Code Online (Sandbox Code Playgroud)

但每当我尝试创建一个类的实例时,我得到这个:

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

我想要做的是通过T4模板访问我的项目中的ClaimConfig类.

任何帮助将不胜感激.

Mel*_*Mel 6

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

<#@ assembly name=“System.Xml” #>
Run Code Online (Sandbox Code Playgroud)

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

<#@ template language="C#" debug="false" hostspecific="true" #>
Run Code Online (Sandbox Code Playgroud)

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

<#@ assembly name="$(SolutionDir)\MyOtherProject\bin\Debug\MyOtherAssembly.dll” #>
Run Code Online (Sandbox Code Playgroud)


Fed*_*gui 5

我强烈建议您将所有公共类(即将在 T4 中和 T4 外使用的类)分开在一个公共程序集中,然后您的项目和 T4 模板可以引用这些类:

 MySolution
 |
 | -> MyProject.Common
 |    |--> ClaimConfig.cs
 | 
 | -> MyProject.Main
 |    |--> References
 |    |    |--> MyProject.Common
 |    | MyT4Template.tt
Run Code Online (Sandbox Code Playgroud)

这样MyProject.Common(其中包含成功编译主项目和 T4 模板所需的所有类)的编译是分开的。

然后在您的模板中:

<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject.Common\bin\Debug\MyProject.Common.dll" #>
Run Code Online (Sandbox Code Playgroud)

此外,我强烈建议您使用 T4 编辑器,例如Tangible T4 Editor,它在编辑 T4 模板时会对您有很大帮助,主要是因为它清楚地突出显示并在“结果代码”(即模板输出)之间产生了视觉差异和“生成代码”(模板内的代码)。他们提供免费版本以及商业完整版本。我使用免费版本,到目前为止它真的很有帮助。