我有一个包含文本模板的ac #project.我想这个模板基于反映项目中的C#类来生成一些SQL.
如何使用T4访问当前项目的内容?是否有可能,如果是,可以使用Reflection,还是只能访问必须解析的原始源?
提前致谢!
我在Visual Studio中使用T4模板进行代码生成,并尝试从模板代码中引用本地.xml文件,以便我可以解析它以获取有关应用程序数据模型的元数据.
当模板代码(在编译时运行或在模板上运行"执行自定义工具")尝试通过Environment.CurrentDirectory获取当前路径时,我得到:
c:\ Program Files(x86)\ Microsoft Visual Studio 9.0\Common7\IDE
我真的试图在项目中找到模板本身的路径,这样我就可以使用相对路径来查找驱动它的.xml文件.有任何想法吗?
自从我上次使用T4以来已经有一段时间了,这可能是一个愚蠢的问题......
是否可以从模板引用任意组件?
例:
我认为以下应该有效
<#@ assembly name="X" #>
Run Code Online (Sandbox Code Playgroud)
但是我在保存时收到以下错误:
编译转换:找不到元数据文件"X"
我究竟做错了什么?
(如果有人感兴趣:我正在尝试根据我从X获得的一些元数据自动生成特定类型的测试)
更新:看起来VS2010已经破坏了我期待的装配分辨率行为.来自http://blogs.msdn.com/b/garethj/archive/2010/04/15/what-s-new-in-t4-in-visual-studio-2010.aspx:
T4的装配集与包含项目的装配集完全分离,以避免在项目针对以前的框架版本时拾取错误的装配.项目程序集不再用于解析模板程序集指令.
除了使用绝对路径之外,还有其他解决方法吗?
我有一个解决方案,其中包含一些项目.我想在我的一个测试项目中创建一些T4模板,以根据另一个项目中的代码生成测试.测试项目有一个项目参考另一个项目.我遇到的问题是我不知道如何获取我需要生成代码的edmx文件的文件路径.
示例(假装这是一个基于ASCII的解决方案资源管理器):
MySolution.sln
-> MyTests.csproj (C:\a\b\c\)
----> GeneratedTests.tt (C:\a\b\c\GeneratedTests.tt)
-> MyDAL.csproj (C:\x\y\z\)
----> MyModel.edmx (C:\x\y\z\MyModel.edmx)
Run Code Online (Sandbox Code Playgroud)
我的GeneratedTests.tt如何利用其项目引用获取MyModel.edmx的文件路径?
我想帮助添加POCO .tt实体框架模板属性以支持WCF序列化,以及是否可能如何将命名空间使用添加到每个实体.
谢谢.
我有一个案例,我需要生成两个CSharp代码文件具有相同的代码但不同的方法的输入和输出类型的命名空间.实际上,每个文件都针对特定国家/地区,而且类型来自特定国家/地区的WSDL.
我正在围绕服务编写一些包装器,逻辑完全相同,但是从WSDL自动生成的类型是不同的.我怎样才能减少编码工作量并在一个地方编写逻辑并为两组不同类型生成逻辑?
嗨,我想找到一种方法将普通字符串作为参数传递给文本模板.
这是我的模板代码,如果有人可以告诉我在c#中需要写什么来传递我的参数并创建类文件.这将非常有帮助,谢谢.
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ parameter name="namespacename" type="System.String" #>
<#@ parameter name="classname" type="System.String" #>
<#
this.OutputInfo.File(this.classname);
#>
namespace <#= this.namespacename #>
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
/// <summary>
/// This class describes the data layer related to <#= this.classname #>.
/// </summary>
/// <history>
/// <change author=`Auto Generated` date=<#= DateTime.Now.ToString("dd/MM/yyyy") #>>Original Version</change> …Run Code Online (Sandbox Code Playgroud) 当我构建我的c#解决方案时,.tt文件将不会创建.cs文件输出.但是,如果我在解决方案资源管理器中一次单击一个.tt文件并选择"运行自定义工具",则会生成.cs,因此构建工具设置是正确的.如何才能使整个解决方案构建强制自定义工具在.tt文件上运行?
我正在使用EnvDTE在我的T4模板中进行代码生成.
我在Visual Studio 2010中正常运行代码,但是我刚刚开始使用Visual Studio 2012,现在当我尝试运行模板时出现以下错误
Compiling transformation: Metadata file 'EnvDTE.dll' could not be found
Run Code Online (Sandbox Code Playgroud)
我实际上没有在我的项目中引用EnvDTE作为它的Silverlight类库,我无法添加DLL,但是它以某种方式找到了DLL.
我不确定10到12之间的区别是什么.
以下是我的ttinclude文件开头的导入和程序集定义.
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".generated.cs" #>
<#@ Assembly Name="EnvDTE.dll" #>
<#@ Assembly Name="System.Data" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
Run Code Online (Sandbox Code Playgroud)
有什么我必须做的不同,以使其适用于Visual Studio 2012
t4 ×10
c# ×4
.net ×2
c#-4.0 ×1
debugging ×1
envdte ×1
parameters ×1
poco ×1
reflection ×1
string ×1
texttemplate ×1
wcf ×1