标签: t4

代码生成器或T4模板,它们真的很邪恶吗?

我听说人们说不应该使用代码生成器和T4模板.这背后的逻辑是,如果您使用生成器生成代码,那么通过泛型和模板构建代码有一种更好的更有效的方法.

虽然我略微同意上面的这个陈述,但我还没有真正找到有效的方法来构建模板,例如可以说实例化自己.换句话说,我永远做不到:

return new T();
Run Code Online (Sandbox Code Playgroud)

此外,如果我想基于数据库值生成代码,我发现Microsoft.SqlServer.Management.SMO与T4模板结合使用可以很好地生成大量代码,而无需复制/粘贴或使用resharper.

我在Generics中发现的许多问题都是令我震惊的是,有很多开发人员不了解它们.当我为一个解决方案检查泛型时,有时它会变得复杂,因为C#表明你不能做一些看似合乎逻辑的事情.

你的想法是什么?你喜欢建造发电机,还是喜欢使用仿制药?此外,仿制药可以走多远?我对泛型有很多了解,但是我总是遇到陷阱和陷阱导致我使用T4模板.

处理需要大量灵活性的场景的更合适的方法是什么?哦,作为这个问题的奖励,C#和Generics的优秀资源是什么?

c# generics t4 code-generation

9
推荐指数
5
解决办法
6174
查看次数

你能用EnvDTE做一个RunCustomTool作为预构建事件吗?

我正在使用T4MVC,我不能使用预构建事件来运行TextTransform.exe,因为它依赖于EnvDTE,并且必须以Visual Studio作为主机运行.

如果我已经运行了一次自定义工具,它运行得很好,因为它在执行(AlwaysKeepTemplateDirty = true)时会标记为脏,但是当你打开解决方案时,它不会在构建时运行,所以我想知道你是否可以通过EnvDTE运行t4作为预建活动?

.net macros t4 envdte t4mvc

9
推荐指数
1
解决办法
2940
查看次数

使用ADO.NET Entity框架从表中的值生成枚举

我的要求是根据DB中表中的值创建一个枚举.我正在使用ADO.NET实体框架模型(.edmx文件),任何人都可以帮助我.

.net ado.net t4 enums entity-framework

9
推荐指数
2
解决办法
4490
查看次数

自动运行t4模板

我想知道是否可以在保存其他文件时运行T4模板,例如在保存xml文件后运行我的.tt文件

我忘了提到我的IDE是VS2010

t4 code-generation visual-studio-2010

9
推荐指数
1
解决办法
1207
查看次数

VS2010禁用T4模板验证

如何禁用T4模板验证.VS2010刚刚验证了我的T4模板,其中有'#'(尖锐的角色).

error CS1040: Preprocessor directives must appear as the first non-whitespace character on a line
Run Code Online (Sandbox Code Playgroud)

这个错误是无稽之谈.我甚至可以从我的模板生成代码,但我无法运行我的项目,因为我的模板抛出错误CS1040.

安装visual t4后出现此错误,即使从扩展管理器卸载也无法正常工作.为VS2010安装Visual T4给我带来亚音速模板的问题.禁用和卸载也没有帮助.我很失望.

t4 preprocessor directive visual-studio-2010

9
推荐指数
1
解决办法
1449
查看次数

构建期间生成T4代码,自定义程序集引用

我有一个T4模板,可以处理我项目中的几个.tt文件.我还有一些我定义的自定义类来帮助代码转换过程.

<#@ template language="C#"  hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="$(TargetDir)\MyDependency.dll" #> 
Run Code Online (Sandbox Code Playgroud)

这适用于Visual Studio,我有一个VS宏,它正确定义$(TargetDir).

现在,我想在构建过程中执行代码生成过程.我补充说:

<TransformOnBuild>true</TransformOnBuild>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
<IncludeDslT4Settings>true</IncludeDslT4Settings> <ItemGroup>
<T4ReferencePath Include="$(OutputPath)" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" /> 
Run Code Online (Sandbox Code Playgroud)

我的构建运行,但我得到:

C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets(407):主机在尝试解析程序集引用'$(TargetDir)\ MyDependency时抛出异常. DLL".转换不会运行.抛出以下异常:System.IO.FileLoadException:给定的程序集名称或代码库无效.(来自HRESULT的异常:0x80131047)System.Reflection.AssemblyName.nInit(RuntimeAssembly&assembly,Boolean forIntrospection,Boolean raiseResolveEvent)位于System.Reflection.AssemblyName.nInit()的Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(String strongName)at at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost主机,TemplateProcessingSession会话)中的ResolveAssemblyReference(String assemblyReference).Line = -1,Column = -1

显然它不会$(TargetDir)在Team构建上下文中解析.

我尝试将TargetDir添加到我的构建配置的属性组中,但无济于事.该值不会传递到T4代码生成器的上下文.

我不想使用环境变量.

如何$(TargetDir)在Team Build上下文中正确设置?

.net msbuild t4

9
推荐指数
1
解决办法
2588
查看次数

如何以编程方式在Visual Studio项目中生成新的Visual Studio项目?

我编写了一个带有数据库表的项目 - 您选择并构建与表列相关的C#类.喜欢,过滤,查询等.

它完全有效,我可以生成6个不同的类,具有完整的功能 - 取决于我的需要 - 只需点击一下即可获得一个表.T4真的很摇滚!

但是,我想为这些类创建一个新项目.如您所知,创建这些文件不是我的最终目标.

现在,我正在尝试以编程方式为这些类生成新的项目/解决方案.

我阅读了与此问题相关的不同问题,但这对我来说还不够.例如,以编程方式创建Visual Studio项目接近我的问题,但它不满足我.我找不到如何选择新项目的类型.

我查看了以编程方式生成Visual Studio解决方案,但我找不到一种方法来为我生成的类提供新的解决方案.我还看了树外科医生.它不满足我.安装之后,我发现它最初是为Visual Studio 2008设计的,它只是从用户那里获取项目名称.因此,树外科医生不是这个问题的解决方案.

我需要的是,学习如何编写新项目的结构并以编程方式创建它.在找到答案之后,我计划有一个项目,当你在浏览器中编写新项目名称,数据库名称,表名和所需类别时,那么T4和C#将适合你和ta-da!您将拥有一个具有控制器,帮助程序和新类的新项目.

可能吗?

c# t4 code-generation database-connection

9
推荐指数
1
解决办法
1167
查看次数

使用EnvDTE收集项目中的用户类列表

我在创建一种方法来创建一种方法来列出我的项目中的所有类EnvDTE使用T4的模板接口(基于命名约定),并且没有任何文档似乎描述了如何做到这一点.我开始时:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ Assembly name="EnvDTE" #>
<#@ Assembly name="System.Core" #>
<#@ import namespace="EnvDTE" #>
<#@ Import Namespace="System.Linq" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#
    var env = (DTE)((IServiceProvider)this.Host)
        .GetService(typeof(EnvDTE.DTE));
Run Code Online (Sandbox Code Playgroud)

......然后我开始侧身.我能够识别我的项目,但是我无法在项目中收集我想要过滤到用于创建接口的平面列表中的类.

我怎样才能做到这一点?我只想要我的项目中的类.

c# t4 envdte

9
推荐指数
1
解决办法
6611
查看次数

T4 - TT - 在TT文件中使用自定义类

我想在我的TT中的CS文件中使用我自己的类定义.

例:

public class ClassDefinition
{
    public string NameSpace { get; set; }
    public string Name { get; set; }
    public string Protection { get; set; }

    List<ClassProperty> Properties { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的TT看起来像:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>

<#@ assembly name="System" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml"#>

<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>

<#@ include file="$(ProjectDir)ClassDefinition.cs" #> …
Run Code Online (Sandbox Code Playgroud)

css c# t4 texttemplate

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

对于跨平台的asp.net 5开发,有没有T4模板和EnvDTE的替代品?

我们目前使用T4模板生成基于C#代码(实体POCO)和EDMX(在旧应用程序中)的C#代码文件

迁移到ASP.NET 5以支持跨平台开发,是否有任何代码生成工具可以读取项目类和元数据结构,并在设计时生成C#文件,类似于T4模板?

t4 code-generation entity-framework-core asp.net-core

9
推荐指数
2
解决办法
4723
查看次数