我正在尝试将T4MVC模板添加到我的项目中,但我遇到了一些问题.我去了Codeplex上,并下载最新版本的T4MVC的,并根据指示,我刚才复制的两个文件T4MVC.tt,并T4MVC.Settings.t4到我的web应用程序的根目录.
我立刻得到了以下错误:
从T4MVC.cs(生成的文件):
命名空间不能直接包含字段或方法等成员
从T4MVC.tt(代码生成模板):
编译转换:找不到类型或命名空间名称'ITextTemplatingEngineHost'(您是否缺少using指令或程序集引用?)
当我打开时T4MVC.cs,它只包含一行:
ErrorGeneratingCode
Run Code Online (Sandbox Code Playgroud)
我发现这篇文章建议再次构建,但该解决方案并不能解决我的问题 - 事实上,它并没有改变一件事.我该怎么办?
我正在VS 2010中构建一个插件,我陷入了T4代.现在我已经实现了(像MSDN建议的)一个自定义T4主机来生成我的T4结果,我以这种方式使用它:
const string content = @"c:\Simple.tt";
var engine = new Engine();
var host = new MyTemplateHost();
var result = engine.ProcessTemplate(File.ReadAllText(content), host);
foreach (CompilerError error in host.Errors)
{
Console.WriteLine(error.ErrorText);
}
Run Code Online (Sandbox Code Playgroud)
这有效,直到我在模板中传递参数.一旦我在.tt文件中创建了一个参数,主机就会说它不知道如何解决它.我看到你可以使用TemplateSession来做到这一点,但我没弄明白如何将它传递给我的主机?是否有更好的方法使用C#从.tt生成代码并在运行时传递参数?也许我走错了路.
在我的VS2010解决方案,我已经根据T4Scaffolding的NuGet设置PowerShell脚本和T4模板的,一切工作脚手架罚款及相关T4的,但在我的剧本之一,我需要触发位于另一个项目T4模板.
这个有什么简单的Powershel cmdlet吗?只运行模板而不传递任何参数或值.
谢谢.
我正在尝试设置一个进程,我的T4模板将在构建服务器上进行转换(Visual Studio未安装在那里).
我已经阅读了所有在线参考文献,但无法获得显示如何执行此操作的明确来源.
具体来说,这是我遇到的两个问题:
C:\ TeamCity的\ buildAgent \工作\ AppSettings.tt(0,0):错误CS0006:编译转型:元数据文件"Microsoft.VisualStudio.TextTemplating.Interfaces.10.0,版本= 10.0.0.0,文化=中立,公钥= b03f5f7f11d50a3a '无法找到
使用gacutil注册DLL文件修复了这个问题,虽然我想避免这一步.
此方法有助于确定模板用作其数据源的.txt文件的完整路径.没有它,无法在构建服务器上找到此文件.
任何帮助将在运行中受到赞赏.
编辑:打开一个MS CONNECT问题:https://connect.microsoft.com/VisualStudio/feedback/details/744137/texttransform-exe-does-not-work-without-vs2010-installed
参考资料我检查过:
在编写T4文本模板的过程中,我遇到了一个我正在努力解决的问题.我需要知道我正在处理的枚举的类型.
我有基于byte和的枚举ushort.我需要T4文本模板来编写代码以将枚举转换为正确的值类型,以便序列化枚举并将其放入字节数组中.
这是byte类型的示例枚举
namespace CodeEnumType
{
public enum MyEnum : byte
{
Member1 = 0,
Member2 = 1,
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的T4文本模板
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="EnvDte" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Collections.Generic" #>
<#
var serviceProvider = this.Host as IServiceProvider;
var dte = serviceProvider.GetService(typeof(DTE)) as DTE;
var project = dte.Solution.FindProjectItem(this.Host.TemplateFile).ContainingProject as Project;
var projectItems = GetProjectItemsRecursively(project.ProjectItems);
foreach(var projectItem in projectItems)
{
var fileCodeModel = projectItem.FileCodeModel;
if(fileCodeModel == …Run Code Online (Sandbox Code Playgroud) 我正在使用.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模板.我听说过很多关于这些模板的东西(主要是在Hanselminutes播客中),并且想了解更多.有关T4模板编写信息的最佳位置是什么?开始实现自己的模板需要什么?我应该知道是否存在陷阱或重要事项?
我看,我没有看到.
我有一个包含两个项目的解决方案 - 项目A(库)和项目B,它是主项目,包含T4文本模板.
到目前为止我做了什么 - 我在主项目中添加了一个项目A的引用.我在模板中包含了这样的行:
<#@ import namespace="MyProjectA" #>
Run Code Online (Sandbox Code Playgroud)
然而,仍然存在错误"编译转换:找不到类型或命名空间名称'MyProjectA'(您是否缺少using指令或程序集引用?)"
问题:如何从文本模板引用项目A?
请注意:我想在解决方案中引用一个项目,而不是磁盘上的dll文件.
我最近切换到Entity Framework 5.现在,我想从现有数据库生成POCO类,我还需要延迟加载和更改跟踪.因此,所有标量属性都应该是虚拟的以及导航属性.
添加新的ADO.Net实体数据模型以.edmx文件和其他一些.cs和.tt文件结尾.
首先,我想知道为什么生成的POCO类默认不符合变更跟踪代理的要求,即标量属性不是虚拟的.
其次,如何生成支持代理的poco类?
PS:我接受了Slauma的答案是迄今为止最好和唯一的答案,但我不同意它的第一部分.这是我的论点
Slauma讨论了代理的两个问题:限制和性能:
关于启用代理的实体的限制:当实体框架在DB First方法中生成类时,类必须遵循以启用更改跟踪代理的规则并不是那么重要,因为它们根本不是限制性的.谁真正关心导航集是IList还是HashSet?只有当应用程序中存在perior设计类并且要从中生成表时,才能理解这些限制.
DB首先不支持复杂属性.所以我们可以将它们从讨论中排除.
关于性能:在所讨论的文章以及我迄今为止研究的其他一些实验中,结果并不是非常有说服力地拒绝代理以支持快照.首先,实验是在大量实体(即10,000)上完成的.应用程序(不在数据库中)中的批处理过程对大量实体起作用并不是不可能的,但是假设有更好的方法,例如存储过程.其次,根据应用程序的类型和需求,我们通常会处理少量的entites,例如当Repository模式被强制使用时; 代理和快照的性能没有区别.有趣的是,在已解决的实验中,重新为属性重新分配相同的值是代理性能显着失败的唯一情况.但谁真的这样做?小心避免反复通知更改跟踪器非常容易.同样,在这种情况下,当处理大量的entites时会出现重大问题.
我正在尝试为CRUD类创建一些脚手架,并希望使用T4来帮助构建这些类.我刚刚开始并且在调用一个住在同一个项目中的类时遇到了问题.例如:
<#@ import namespace="System.Collections.Generic" #>
<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ include file="T4Toolbox.tt" #>
using System;
using System.Data;
using System.Data.Linq;
using System.Collections.Generic;
namespace TTFileGenerator
{
<#var entityName = "TEST";#>
public class <#=entityName#>
{
<#
MyClass myClass = new MyClass();
List<string> something = myClass.GetSomething()
...
#>
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
编译转换:找不到类型或命名空间名称"MyClass"(您是否缺少using指令或程序集引用?)
它是同一个项目中的公共类.我可以从项目中的其他类访问它而不是T4文件.还是一个T4新手.任何方向将不胜感激.