我正在尝试调试预处理的T4模板,我无法进入通过运行预处理模板创建的类.我能够创建一个类的实例,但是一旦我尝试在调试时进入,就会弹出一个新窗口
没有可用的来源.当前位置没有可用的源代码.
我的理解是,预处理模板可以像普通的c#类一样进行调试,这不正确吗?为了能够进入由预处理模板定义的类,您需要做些什么吗?
这是一个非常简单的模板和我遇到问题的调用代码:
TestPreprocessedTemplate.tt:
<#@ template language="C#" debug="true" #>
Hello <# Write("World"); #>
Run Code Online (Sandbox Code Playgroud)
测试代码:
var template = new TestPreprocessedTemplate();
string test = template.TransformText();
Run Code Online (Sandbox Code Playgroud)
编辑 - 根据下面的建议添加了debug ="true"语句,仍然有同样的问题.
更新 - 我也在MSDN论坛上发布了这个问题,并收到了MS员工的回复,表明我上面描述的内容应该确实有效.还有其他人遇到过这个问题吗?
更新 - 在MSDN论坛的帮助下,问题在于将#line指令添加到生成的c#类中.评论它们允许我按预期逐步执行代码.有没有办法阻止这些指令被添加到生成的类?使用ASP.NET页面,您可以添加LinePragmas ="false"参数,但这似乎对T4模板没有任何影响.有任何想法吗?
我想使用T4生成片段,但在将.tt文件添加到Wix项目后,此文件没有"自定义工具"选项.右键单击.tt文件时没有菜单项"运行自定义工具".
这有什么黑客攻击吗?我正在使用VS 2010和最新的Wix 3.5
我在不同的项目中通过我的解决方案传播了6个T4模板,是否可以通过单击运行它们或者我是否需要逐个浏览它们?
如何指定T4模板的输出路径?
当我使用"添加为链接"添加我的T4模板到我的项目时$TemplatePath$,它生成输出文件$TemplatePath$,而不是$ProjectPath$.如何指定$ProjectPath生成文件的放置位置?
我正在编写一个通用方法,在T4模板的特殊任务中使用它.该方法应该允许我使用通用接口中的专用类型.我想到了以下签名:
interface IGreatInterface {
Object aMethodAlpha<U>(U parameter) where U : IAnInterface;
Object aMethodBeta(IAnInterface parameter)
}
public class AnInterestingClass : IAnInterface{}
Run Code Online (Sandbox Code Playgroud)
当我尝试实现IGreatInterface编译器标记错误时,aMethodBeta()因为我已经让我的T4使用子类型编写该方法IAnInterface(即我想像这样实现该方法:) Object aMethodBeta(AnInterestingClass parameter).
方法aMethodAlpha<U>()可以使用,但不是我想要的干净,因为我的T4必须生成一些额外的代码.我(也许错误地)提出必须由T4完成该方法的实现
Object aMethodAlpha<AnInterestingClass>(AnInterestingClass parameter).
我认为泛型方法不支持逆变类型,但我不确定; 我想这是编译器阻止编码器使用具有未在通用类型中定义的方法的特定类型的方式...
我有一个相当复杂的东西塞进T4模板.基本上我采取类似的东西
{= foo =}更多文字...
并将其转换为类(视图),如下所示:
public class MyView
{
public string foo{get;set;}
public string Write()
{
return foo+@" more text...";
}
}
Run Code Online (Sandbox Code Playgroud)
生成的代码当然要复杂得多.无论如何,T4模板现在超过600行代码,并且真正变得难以管理.我认为主要问题是混合代码和"内容"(即静态代码).我不确定如何干净地解决这个问题(当然不会影响生成的代码).我也没有看到任何可行的单元测试我的T4代码的方法,除了简单地测试它的T4执行错误.当然,似乎几乎不可能测试它生成的代码.
我可以使用任何"模型 - 视图"类型的框架或技术来使我的T4模板代码更干净吗?
我使用EF 5和Model First方法创建了一个EDMX,即我从一个空白设计师开始并模拟我的实体.现在,我希望能够使用EDMX中定义的此模型,但提供运行时SQL Server连接字符串,而无需修改配置文件.
我知道如何将连接字符串传递给DbContext,但问题是找到程序集中映射的元数据.
例如,我的EDMX在app.config中有这个连接字符串
<add name="MesSystemEntities" connectionString="metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=MyMachine;initial catalog=MesSystem;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
我失踪的部分是 "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;"
我希望能够以DbContext编程方式创建一个SQL Server连接字符串,但"添加"元数据部分.
这就是我希望T4文件生成的内容......
public partial class MesSystemEntities : DbContext
{
public MesSystemEntities()
: base("name=MesSystemEntities")
{
}
public MesSystemEntities(string sqlServerConnectionString)
: base(GetEfConnectionString(sqlServerConnectionString))
{
}
private string GetEfConnectionString(string sqlServerConnectionString)
{
// values added by T4 generation
string format = "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;;provider=System.Data.SqlClient;provider connection string=\"{0}\"";
return String.Format(format, sqlServerConnectionString);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在T4生成文件中获取我需要的元数据来创建实体框架连接,而无需为每个EDMX文件对其进行硬编码
要么
是否有更简单的方法以编程方式从程序集加载元数据?
当我使用EF Power Tools逆向工程生成上下文时,它在我的数据库名称的文件中创建了一个带有我的数据库名称的类.我能够修改T4模板以使用Context类名称的静态名称.但是,我想在类的文件名中使用相同的静态名称.我怎样才能做到这一点?
以前,使用Visual Studio 2012,我能够将CodeTemplates文件夹放到我的项目目录中,然后修改现有T4 templates或添加全新的T4模板以满足我的特定代码生成要求.
似乎前面描述的方法将不再适用于Visual Studio 2013引入的新脚手架引擎.特别是,新的脚手架逻辑似乎存在于此:
C:\ Program Files(x86)\ Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding
我假设您需要构建一个新的自定义脚手架DLL并使用Visual Studio注册它以执行您自己的代码生成.当然,我不知道该怎么做.
那么,有没有人知道在Visual Studio 2013中使用自定义T4模板生成代码(例如视图)的方法?
我正在使用.Net Core 1.1
我想在Visual Studio 2017 15.1中使用T4生成一些代码
MultipleOutputHelper.ttinclude:
<#@ assembly name="System.Core"#>
<#@ assembly name="System.Data.Linq"#>
<#@ assembly name="EnvDTE"#>
<#@ assembly name="System.Xml"#>
<#@ assembly name="System.Xml.Linq"#>
<#@ import namespace="System.Collections.Generic"#>
<#@ import namespace="System.IO"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
<#+
// https://github.com/damieng/DamienGKit/tree/master/T4/MultipleOutputHelper
// http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited
// Manager class records the various blocks so it can split them up
class Manager {
private class Block {
public string Name;
public int Start, Length;
public bool IncludeInDefault;
}
private Block currentBlock;
private readonly …Run Code Online (Sandbox Code Playgroud) t4 ×10
c# ×6
.net ×1
.net-4.0 ×1
.net-4.5 ×1
.net-core ×1
generics ×1
oop ×1
refactoring ×1
scaffolding ×1
unit-testing ×1
wix ×1