所有
我有一个T4模板
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="MyLibrarysRootNameSpace.SomeNamespace" #>
/*Rest of template follows*/
我正在尝试导入最后一行,以便我可以轻松地在其他项目中重复使用此模板,但我似乎错过了一些东西。我正在尝试做什么?如果是这样,怎么样?
答案 0 :(得分:9)
导入只是添加一个using语句,它不引用程序集。 T4引用的程序集与托管模板的项目完全分开。
如果您想引入托管项目的程序集,那么您需要一个程序集指令来执行此操作。如下所示:
&lt;#@ assembly name =“$(TargetPath)”#&gt;
请注意,您在这里引入了一个构建循环,因此项目需要手动干预才能生成一次DLL,因此请确保只生成可选的部分或始终使用之前签入的版本。
答案 1 :(得分:1)
如果我理解你的问题:
复制粘贴前2个片段from there以获取包含T4的项目的EnvDTE对象模型:
<#@ assembly name="EnvDte" #>
<#
var visualStudio = ( this.Host as IServiceProvider )
.GetService( typeof( EnvDTE.DTE ) ) as EnvDTE.DTE;
var project = visualStudio.Solution
.FindProjectItem( this.Host.TemplateFile )
.ContainingProject as EnvDTE.Project;
#>
然后,使用the method from there获取该项目的默认命名空间:
// project is of type: EnvDTE.Project
string strDefaultNamespace = project.Properties.Item( "DefaultNamespace" )
.Value.ToString();
然后,使用strDefaultNamespace
值,不管你喜欢。