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

时间:2013-10-14 16:13:34

标签: c# c#-4.0 t4

我尝试使用T4模板在我的项目中自动生成一些代码使用。我开始小的时候让我的脚湿透了#39;这就是我到目前为止所做的。

<#@ 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" #>

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

命名空间不能直接包含字段或方法等成员。 编译转换:类型或命名空间名称&#39; ClaimConfig&#39;找不到(你错过了使用指令或汇编引用吗?)

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

这类似于我过去看过的另一个问题(How do I use custom library/project in T4 text template?)。您需要使用“assembly”指令引用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” #>

答案 1 :(得分:4)

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

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

因此,MyProject.Common(包含成功编译Main项目和T4模板所需的所有类)的编译是分开的。

然后在你的模板中:

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

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