标签: t4

2(3)关于T4模板的问题,获取正在处理的主文件的名称,并能够结束处理?

我正在尝试为项目创建自己的DSL,并且我想创建一个包含主要引擎的T4文件,然后创建包含此引擎并调用它的小T4文件.

我正在考虑为将调用引擎的T4文件尝试这种格式:

<#@ include file="EngineLib\EngineLib.tt" #>
<# RunEngine(); #>
dsl goes here
Run Code Online (Sandbox Code Playgroud)

我有三个问题如下:

1.我可以获取主脚本的名称吗?

基本上,在EngineLib.tt中,我可以检索包含它的脚本的完整路径和文件名,在这种情况下,脚本如上所示?或者,如果没有,内容呢?

2.我可以结束脚本处理吗?

例如,在RunEngine()方法内部,如果第一个问题产生答案,我将读取原始脚本,删除包含T4指令的第一行,然后根据我的DSL规则处理文件的其余部分.

然后,当RunEngine从该DSL产生代码结果时,我将终止T4代码的处理,因此DSL本身不作为生成文件的一部分输出.

这有意义吗?

假设RunEngine只输出一个类,如果我不能终止处理,这就是生成的文件的样子:

public class SomeClass
{
}
dsl goes here
Run Code Online (Sandbox Code Playgroud)

显然我不希望DSL代码作为我生成的输出的一部分.

我在错误的树上吠叫吗?

我知道我不能在DSL中包含类似T4的代码,因为这最终会被编译成代码,这些代码将作为T4处理的一部分运行,但在这种情况下它不会成为问题.

我还没有想到的其他任何事情都可能出错?

.net dsl t4 visual-studio-2010

3
推荐指数
1
解决办法
1081
查看次数

TT发电机中的辅助方法

我试图在我的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中我得到以下错误

编译转换:}预期

有没有办法做到这一点?

c# t4 code-generation

3
推荐指数
1
解决办法
578
查看次数

实体框架文件未嵌套在 EDMX 文件下

我知道这是从这里复制的,但我也有一个问题,即 TT 文件未嵌套在 edmx 文件下。重复问题的解决方案只是将实体类放在 TT 下,而不是将 TT 放在 edmx 下。提前致谢。

c# asp.net-mvc t4 entity-framework edmx

3
推荐指数
1
解决办法
709
查看次数

T4模板如果Else语句写出对象而不是文本?

我试图获取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)

c# t4

3
推荐指数
1
解决办法
3765
查看次数

将 T4 生成的代码写入单独的输出文件

我正在创建一个.tt将文本转换为模型类的文件,以进行练习。

.cs生成一个文件,其中包含 all models,但我希望每个文件都model保存在.cs不同文件夹中自己的文件中。

实现这一目标的最佳方法是什么?

.net c# t4 templates transformation

3
推荐指数
1
解决办法
2409
查看次数

如何更改T4模板中的输出文件?

这是我的代码,它工作正常,但它在 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)

c# asp.net asp.net-mvc t4

3
推荐指数
1
解决办法
1645
查看次数

简单实用的C#代码生成(VS 2008或2010)

我推迟使用生成的代码作为构建过程的一部分,因为它担心它在构建过程中引入的复杂性.

有没有一种简单的方法可以将构建时生成的代码集成到应用程序中?

我正在考虑的代码类似于 Visual Studio执行的资源和设置文件代码生成:

  • 在这里进行智能感知很有价值
  • 属性之间有很多属性和链接,这些属性和链接很容易描述,但是不可能在C#中简洁地实现.
  • 底层资源是可修改的,代码自动重新生成,无需任何用户交互,也无需了解生成器的内部.

对于(非现实世界)示例,考虑通过类似命名的C#属性(或方法)生成对正则表达式的命名捕获组的访问者的预编译器.这是我想要生成的各种事物的典型:样板包装器的长片段,其主要功能是启用编译时检查错误(在上面;访问不存在的捕获组或写入和无效的正则表达式)和否不太重要的是,这些属性的智能感知.最后,这个设置应该可以由团队中的其他人轻松使用,只有极少的学习曲线.即,要求手动干预以重新生成代码是绝对不可接受的,也不能接受将生成的代码提交到源代码控制中.在最坏的情况下,每个人都应该只需要安装一些扩展; 理想情况下,扩展应该可以安装到源树中,这样任何签出树的人都可以在没有任何介绍的情况下构建项目.

为了使其运行良好,IDE集成非常重要:更新底层的"资源"定义文件应该触发 代码的重新生成而无需任何用户交互,理想情况下,生成器本身将很容易为其他开发人员维护(即一些发电机调试能力是一个加号).

最后,类似XSLT的方法是理想的,其中相同的模板可以应用于各种输入资源 ; 因为这意味着你甚至不需要查看实际的生成器代码,如果你想要做的就是更新资源,并且因为它使模板重用变得微不足道.

我看过T4,但是从我看到的这个方法有一个不太方便的ASP方法,模板和资源没有干净地分开(即,生成器负责查找资源 - 这使模板重用变得不那么容易).

是否有更好(更干净)的解决方案或运行T4的某种方式,以便可以轻松地重复使用相同的模板并且(很像.NET设置文件)资源的任何更新都会自动触发已实现代码的重新生成?

简介: 我正在寻找可以实现的代码方法

  1. 当底层资源(不是模板!)发生变化时,无需开发干预即自动重新生成代码.
  2. 维护起来有点简单
  3. 能够在多个资源之间共享相同的生成器模板(其中,#1点可能意味着资源应该引用生成器,反之亦然).

c# t4 code-generation visual-studio

2
推荐指数
1
解决办法
1916
查看次数

如何让VS2010中的T4迭代类的属性

我正在使用Visual Studio 2010,并安装了tangibleT4EditorPlusModellingTools.

我只是在玩T4,从未接触过它.我想做的是查看项目中的一个类,并写出每个属性.

任何人都可以给我绝对的初学者提示如何构建.tt文件?我用谷歌搜索了这个并没有找到答案,所以任何帮助都会受到赞赏.

谢谢.

asp.net-mvc t4

2
推荐指数
1
解决办法
1855
查看次数

T4使用C#和VB以外的语言

用其他.NET语言编写T4模板是否可行?特别是我对F#和IronPython感兴趣.

.net t4 f# ironpython

2
推荐指数
1
解决办法
548
查看次数

通过TDS生成代码时,Visual Studio变量未被转换

在.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)

t4 sitecore tds

2
推荐指数
1
解决办法
763
查看次数