我尝试使用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类。
非常感谢任何帮助。
答案 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模板输出)和“生成代码”(模板内的代码)。它们提供免费版本以及商业完整版。我使用免费版本,到目前为止它确实非常有用。