T4模板:在主机程序集中导入名称空间

时间:2013-04-12 23:19:15

标签: c# t4

所有

我有一个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*/

我正在尝试导入最后一行,以便我可以轻松地在其他项目中重复使用此模板,但我似乎错过了一些东西。我正在尝试做什么?如果是这样,怎么样?

2 个答案:

答案 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值,不管你喜欢。