我是一个T4新手试图使用T4工具箱根据这个答案生成F#代码,但似乎类功能块不能与语句块混合使用.这是我的代码:
<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="txt" #>
<#@ include file="T4Toolbox.tt" #>
<#
FSharpTemplate template = new FSharpTemplate();
template.Output.Project = @"..\Library1\Library1.fsproj";
template.Output.File = "Module2.fs";
template.Render();
#>
<#+
class FSharpTemplate: Template
{
public override string TransformText()
{
#>
module Module2
<# for (int i = 0; i < 10; i++) { #>
<#= i #>
<# } #>
<#+
return this.GenerationEnvironment.ToString();
}
}
#>
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
在模板中的第一个类功能之后,语句无法显示.在第一个类功能块之后,只允许使用样板,表达式和其他类功能.
那么......我怎样才能重写模板来实现这个目标呢?
我想获得一个MyAttribute
使用T4/EnvDTE 装饰的项目中所有公共方法的列表.
我知道这可以用反射来实现,但我不希望加载的组装和反映了它在T4模板,相反,我想用现有的代码文件作为来源.
以下是我在互联网上找到的样板代码,它获取对当前项目的引用
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="EnvDTE" #>
<#@ assembly name="System.Core.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>
<#
IServiceProvider _ServiceProvider = (IServiceProvider)Host;
if (_ServiceProvider == null)
throw new Exception("Host property returned unexpected value (null)");
EnvDTE.DTE dte = (EnvDTE.DTE)_ServiceProvider.GetService(typeof(EnvDTE.DTE));
if (dte == null)
throw new Exception("Unable to retrieve EnvDTE.DTE");
Array activeSolutionProjects = (Array)dte.ActiveSolutionProjects;
if (activeSolutionProjects == null)
throw new Exception("DTE.ActiveSolutionProjects returned null"); …
Run Code Online (Sandbox Code Playgroud) 我在一个新的项目工作的一个典型的三层架构下的:business
,data
并client
采用了棱角分明的正面.
在这个项目中,我们将有一个我们想要自动执行的重复任务:创建CRUD.我们想要做的是生成模型和控制器(put,get,post,delete)以及来自实体及其属性的其他基本项目信息.
这是我最好的选择?我曾经考虑过模板T4,但是我对它们的无知使我怀疑它是否是最好的选择.
例如,从这个实体:
public class User
{
public int Id { get; set; }
public string Name {get;set;}
public string Email{ get; set; }
public IEnumerable<Task> Task { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想生成以下模型:
public class UserModel
{
public int Id { get; set; }
public string Name {get;set;}
public string Email{ get; set; }
public IEnumerable<Task> Task { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
还有控制器:
{
/// <summary>
/// User controller
/// </summary>
[Route("api/[controller]")]
public …
Run Code Online (Sandbox Code Playgroud) 我有一个类似于这里描述的问题:MVC T4 MvcTextTemplateHost和自定义"控制器"T4模板,但希望,更简单.
我有一个用于ASP.NET MVC项目的自定义视图模板(View.tt,Create.tt).我无法弄清楚如何在这些视图模板中获取控制器名称.mvcHost.ControllerName和mvcHost.ControllerRootName在视图模板中都为空.但是,管道控制器名称中的某个位置是已知的,因为视图是在ControllerName文件夹中创建的.我想在模板本身中引用它.
具体来说,我想生成HTML.ActionLink("Edit", MVC.<controllername>.Edit(id))
而不是HTML.ActionLink("Edit", "Edit", new {id = item.id})
是否可以在View模板中获取控制器的名称?
如何将项目相对包含在项目根目录中?有点像<# @include file="~/Infrastructure/Manager.ttinclude" #>
有没有办法在设计时进行预编译反射?
我的意图是使用T4基于实现某些接口的类来吐出自定义代码.我知道我可以调用反射,但我希望T4脚本在编译之前吐出额外的代码,否则我需要编译代码两次,一次生成dll,两次让T4反映先前生成的dll并添加额外的脚手架.
有没有办法在设计时做反思?
有一个更好的方法吗?
我有一个Windows应用程序,它使用带有T4模板的可移植类库.当我运行转换时它失败并出现以下错误:
Compiling transformation: The type 'System.Object' is defined in an assembly
that is not referenced. You must add a reference to assembly 'System.Runtime,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
Run Code Online (Sandbox Code Playgroud)
我尝试手动添加对System.Runtime库的引用,但是我收到消息"组件已经被构建系统自动引用"
同一个库可以在Silverlight项目以及Windows Phone项目中使用.
有谁知道问题出在哪里?
我是开发Windows应用商店应用程序的新手,所以它可能是一些微不足道的错误,但我无法找到任何解决方案.
我在尝试确定为什么MSBuild阻止访问我刚刚创建的新T4模板中使用的dll时遇到了很多麻烦.
这个问题很难解释(甚至可以问,标题很明显).
我创建了一个T4模板来生成ac#类,它是我们拥有的其他N个类的包装器.这是我提出的在同一端点上公开多个WCF服务的解决方案.
模板代码本身使用包含各种扩展方法的程序集(Mobiltec.Framework.dll)来简化模板代码.起初,我刚刚将一个.tt文件添加到项目中并继续使用它:每当.tt改变时,它都会按预期更新生成的文件.
由于这个模板读取其他程序集并基于它们生成一个类,我想确保它在每个构建中转换输出,以防止开发人员忘记更新输出和类似的东西.
经过几天的搜索,我终于找到了一个相当不错的解决方案,模板正在每个版本"几乎"完美地转换.问题在于,每当我构建项目并转换模板时,它都会锁定对前面提到的dll的访问,从而阻止我之后删除或更新文件.我必须关闭Visual Studio才能释放该文件.
现在,这对本地开发人员机器来说不是一个大问题,但它在构建服务器上的构建失败,因为那里的输出都在一个文件夹中:
这是文本模板系统中的错误还是我可能会犯一些导致文件被锁定的错误?
更新
我会尝试更好地解释一下如何设置所有内容,以便你们可以更好地理解这个问题.
有一个.tt模板文件,每个Web应用程序一个(总共有4个).此模板负责自动为所有WCF服务合同生成包装类.合同本身在另一个程序集中分开(对于四个组件中的每一个也是一个),以便它们可以与客户端共享,而不会携带所有其他依赖项.
我必须实现一组方法来使用反射,每个程序集中的签名,成员和类型进行打印,以生成可以编译为有效类的文本.我在一个通用程序集上实现了这些方法.
然后,每个tt文件引用此公共程序集以及服务契约程序集,以生成此包装类.例如,模板有一堆这样的行:
<#@ assembly name="Mobiltec.M3.EG.Services.dll" #>
<#@ assembly name="Mobiltec.M3.Common.dll" #>
Run Code Online (Sandbox Code Playgroud)
由于我们需要在每个构建中转换这些模板,因此我已经更改了项目文件以启用它并按照此建议安装Visual Studio SDK和Visualization and Modeling SDK .
现在,每当我对任何程序集或其依赖项中的代码进行任何更改时,我都会收到以下消息:
Error 1516 Compiling transformation: Metadata file 'Mobiltec.M3.EG.Services.dll' could not be found. Line=0, Column=0 Mobiltec.M3.EG
Error 1517 Compiling transformation: Metadata file 'Mobiltec.M3.Common.dll' could not be found. Line=0, Column=0 Mobiltec.M3.EG
Run Code Online (Sandbox Code Playgroud)
要么:
Error 395 Could not copy "D:\TFS05\M3\Desenvolvimento\Feature-ODataM3S\ProjetosManutencao\Mobiltec.M3.Common\Mobiltec.M3.Common.Desktop\bin\Mobiltec.M3.Common.dll" to "bin\Mobiltec.M3.Common.dll". Exceeded retry count of …
Run Code Online (Sandbox Code Playgroud) 我刚刚第一次尝试使用Visual Studio 2015打开我的一个项目,它说:
未找到importede项目"C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets".确认<Import>声明中的路径是正确的,并且该文件存在于磁盘上.
这些文件确实不存在于磁盘上.我需要安装什么样的SDK才能在VS 2015中使用文本模板?
t4 ×10
.net ×5
c# ×2
asp.net-mvc ×1
build ×1
design-time ×1
dsl ×1
envdte ×1
msbuild ×1
reflection ×1
t4-toolbox ×1
tfsbuild ×1
vsx ×1