我正在尝试为项目创建自己的DSL,并且我想创建一个包含主要引擎的T4文件,然后创建包含此引擎并调用它的小T4文件.
我正在考虑为将调用引擎的T4文件尝试这种格式:
<#@ include file="EngineLib\EngineLib.tt" #>
<# RunEngine(); #>
dsl goes here
Run Code Online (Sandbox Code Playgroud)
我有三个问题如下:
基本上,在EngineLib.tt中,我可以检索包含它的脚本的完整路径和文件名,在这种情况下,脚本如上所示?或者,如果没有,内容呢?
例如,在RunEngine()方法内部,如果第一个问题产生答案,我将读取原始脚本,删除包含T4指令的第一行,然后根据我的DSL规则处理文件的其余部分.
然后,当RunEngine从该DSL产生代码结果时,我将终止T4代码的处理,因此DSL本身不作为生成文件的一部分输出.
这有意义吗?
假设RunEngine只输出一个类,如果我不能终止处理,这就是生成的文件的样子:
public class SomeClass
{
}
dsl goes here
Run Code Online (Sandbox Code Playgroud)
显然我不希望DSL代码作为我生成的输出的一部分.
我知道我不能在DSL中包含类似T4的代码,因为这最终会被编译成代码,这些代码将作为T4处理的一部分运行,但在这种情况下它不会成为问题.
我还没有想到的其他任何事情都可能出错?
我试图在我的T4生成器中放入一个辅助方法,使一些生成逻辑更简单,但我不能让它正确编译.我想稍后在.tt中使用这个助手(不要将它作为输出生成)
如果我把以下内容
<#
public static void Test()
{
}
#>
Run Code Online (Sandbox Code Playgroud)
要么
<#
public static class Helpers
{
public static void Test()
{
}
}
#>
Run Code Online (Sandbox Code Playgroud)
在我的.tt中我得到以下错误
编译转换:}预期
有没有办法做到这一点?
我知道这是从这里复制的,但我也有一个问题,即 TT 文件未嵌套在 edmx 文件下。重复问题的解决方案只是将实体类放在 TT 下,而不是将 TT 放在 edmx 下。提前致谢。
我试图获取If else语句来计算基于从循环传入的对象的值.这个模板一直有效,直到我添加到if else块中,它说它不能用作语句.思考?
<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="CookieCutterDT" #>
<#@ import namespace="CookieCutterBL.DT_Template" #>
namespace <#= NameSpace #>
{
public class <#= ClassName #>
{
<#
foreach(ColumnDT c in Columns)
{#>
public <# if (c.IsNullable && c.DataType != "string" && c.DataType != "string []") { c.DataType + "?"; } else { c.DataType; } #> <#= c.ColumnName #> { get; set; };
<#
} …Run Code Online (Sandbox Code Playgroud) 我正在创建一个.tt将文本转换为模型类的文件,以进行练习。
.cs生成一个文件,其中包含 all models,但我希望每个文件都model保存在.cs不同文件夹中自己的文件中。
实现这一目标的最佳方法是什么?
这是我的代码,它工作正常,但它在 Enums.tt 下创建 .cs 文件,文件名是 Enums. generated.cs 但我想在项目中的特定位置创建一个输出文件,如何实现这一点?
让我知道有什么办法可以做到这一点。我搜索了这个,但没有找到任何合适的解决方案。
<#@ template debug="true" hostSpecific="false" #>
<#@ output extension=".generated.cs" #>
<#@ Assembly Name="System.Data" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#
string tableName = "ContentTypeMaster";
string columnId = "Id";
string columnName = "Name";
string connectionString = "Data Source=192.168.120.71;Initial Catalog=ErisWebsite;Persist Security Info=True;User ID=IM;Password=Intellimedia$#12;MultipleActiveResultSets=True;Connection Timeout=5000";
#>
using System;
using System.CodeDom.Compiler;
namespace ER.ErisCampaign.Enums
{
/// <summary>
/// <#= tableName #> auto generated enumeration
/// </summary> …Run Code Online (Sandbox Code Playgroud) 我推迟使用生成的代码作为构建过程的一部分,因为它担心它在构建过程中引入的复杂性.
有没有一种简单的方法可以将构建时生成的代码集成到应用程序中?
我正在考虑的代码类似于 Visual Studio执行的资源和设置文件代码生成:
对于(非现实世界)示例,考虑通过类似命名的C#属性(或方法)生成对正则表达式的命名捕获组的访问者的预编译器.这是我想要生成的各种事物的典型:样板包装器的长片段,其主要功能是启用编译时检查错误(在上面;访问不存在的捕获组或写入和无效的正则表达式)和否不太重要的是,这些属性的智能感知.最后,这个设置应该可以由团队中的其他人轻松使用,只有极少的学习曲线.即,要求手动干预以重新生成代码是绝对不可接受的,也不能接受将生成的代码提交到源代码控制中.在最坏的情况下,每个人都应该只需要安装一些扩展; 理想情况下,扩展应该可以安装到源树中,这样任何签出树的人都可以在没有任何介绍的情况下构建项目.
为了使其运行良好,IDE集成非常重要:更新底层的"资源"定义文件应该触发 代码的重新生成而无需任何用户交互,理想情况下,生成器本身将很容易为其他开发人员维护(即一些发电机调试能力是一个加号).
最后,类似XSLT的方法是理想的,其中相同的模板可以应用于各种输入资源 ; 因为这意味着你甚至不需要查看实际的生成器代码,如果你想要做的就是更新资源,并且因为它使模板重用变得微不足道.
我看过T4,但是从我看到的这个方法有一个不太方便的ASP方法,模板和资源没有干净地分开(即,生成器负责查找资源 - 这使模板重用变得不那么容易).
是否有更好(更干净)的解决方案或运行T4的某种方式,以便可以轻松地重复使用相同的模板并且(很像.NET设置文件)资源的任何更新都会自动触发已实现代码的重新生成?
简介: 我正在寻找可以实现的代码方法
我正在使用Visual Studio 2010,并安装了tangibleT4EditorPlusModellingTools.
我只是在玩T4,从未接触过它.我想做的是查看项目中的一个类,并写出每个属性.
任何人都可以给我绝对的初学者提示如何构建.tt文件?我用谷歌搜索了这个并没有找到答案,所以任何帮助都会受到赞赏.
谢谢.
在.tt T4模板中引用程序集时,我应该可以使用以下声明:
<#@ assembly name="$(SolutionDir)\..\..\Build\lib\HedgehogDevelopment.CodeGeneration.Extensions.dll" #>
从我所看到的,SolutionDir没有被转换,我收到一条错误消息(下面)
注:该HedgehogDevelopment.CodeGeneration.Extensions.dll不能被添加到GAC或作为DLL需要与项目一起通过Visual Studio的组件文件夹.
我不知道TDS代码生成是如何执行的,所以我在这里询问是否有人解决了类似问题.
错误| 10 |主机在尝试解析程序集引用'$(SolutionDir)......\Build\lib\HedgehogDevelopment.CodeGeneration.Extensions.dll'时抛出异常.转换不会运行.
抛出以下异常:System.IO.FileLoadException:给定的程序集名称或代码库无效.(来自HRESULT的异常:0x80131047)System.Reflection.AssemblyName.nInit(RuntimeAssembly&assembly,Boolean forIntrospection,Boolean raiseResolveEvent)在System.Reflection.AssemblyName..ctor(String assemblyName)at Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(String在Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost主机,TemplateProcessingSession会话)的Microsoft.VisualStudio.TextTemplating.VSHost.TextTemplatingService.ResolveAssemblyReference(String assemblyReference)中的strongName)