自从我上次使用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的装配集与包含项目的装配集完全分离,以避免在项目针对以前的框架版本时拾取错误的装配.项目程序集不再用于解析模板程序集指令.
除了使用绝对路径之外,还有其他解决方法吗?
这是我在StackOverflow上的第一个问题,所以嗨:)
是否可以使用T4模板中的Assembly.Load()按程序集名称加载程序集?我想用它来获取加载程序集中具有ServiceContract属性的所有类型.
var loadedAssembly = Assembly.Load(assemblyName);
var types = from type in loadedAssembly.GetTypes()
where Attribute.IsDefined(type, typeof(ServiceContractAttribute))select type;
Run Code Online (Sandbox Code Playgroud)
在我的模板所在的项目中引用所需的程序集.我想通了
<#@ assembly name="$(TargetDir)\DesiredAssemblyName.dll" #>
var loadedAssembly = Assembly.GetAssembly(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)
有效,但它似乎不是一个好的解决方案.此外,我希望该模板在构建后以及向.csproj添加以下行时进行转换
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\
TextTemplating\v10.0\Microsoft.TextTemplating.targets"/>
<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
</PropertyGroup>
<ItemGroup>
<!--Add VS\...\PublicAssemblies to the list of places
to look for assemblies used by templates.-->
<T4ReferencePath Include="..\Onii.Vespa.AppServer\"/>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
使用Assembly.GetAssembly的解决方案也不起作用.谢谢你的所有建议.
我需要在T4模板中进行JSON模式生成,并且发现Newtonsoft的新Schema类已经足够用于手头的目的(在一个控制台应用程序中,经过测试),但是,我似乎无法让它与其他人一起玩,因为Newtonsoft的实例总是返回null.
T4声明:
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="Newtonsoft.Json.dll" #>
<#@ assembly name="Newtonsoft.Json.Schema.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
Run Code Online (Sandbox Code Playgroud)
程序集引用指向DLL文件,我在项目的项目设置中设置了文件夹查找,屏幕截图如下:

尝试做类似下面的事情,失败了,因为找不到Newtonsoft:
var schema = Newtonsoft.Json.Schema.JSchema.Parse(jsoncontent);
抛出的错误是:找不到元数据文件'Newtonsoft.Json.Schema.dll".
我使用ASP.NET MVC 3 自定义CodeTemplates我需要将一些方法放在一个t4文件中,然后在我的所有t4模板中使用它.
所以这是我的general.tt文件:
<#@ template language="C#" #>
<#@ assembly name="System" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.ComponentModel.DataAnnotations" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Data.Entity" #>
<#@ assembly name="System.Data.Linq" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.ComponentModel.DataAnnotations" #>
<#@ import namespace="System.ComponentModel" #>
<#@ import namespace="System.Data.Linq.Mapping" #>
<#@ import namespace="System.Data.Objects.DataClasses" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="Microsoft.VisualStudio.Web.Mvc.Scaffolding.BuiltIn" #>
<#+
public …Run Code Online (Sandbox Code Playgroud)