6

全部,

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

我正在尝试导入最后一行,以便我可以轻松地在其他项目中重用此模板,但我似乎遗漏了一些东西。我正在尝试做的事情可能吗?如果是这样,怎么做?

4

2 回答 2

11

导入只是添加了一个 using 语句,它不引用程序集。T4 的引用装配集与承载模板的项目完全分离。

如果您想引入托管项目的程序集,那么您需要一个程序集指令来执行此操作。类似于以下内容:

<#@ 程序集名称="$(TargetPath)" #>

请注意,您在这里引入了构建循环,因此项目将需要手动干预才能构建,直到它生成了一次 DLL,因此请确保您只生成可选的部分或始终可以使用先前签入的版本。

于 2013-04-15T17:17:55.883 回答
1

如果我正确理解了您的问题:

从那里复制粘贴前 2 个片段以获得包含 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;
#>

然后,使用那里的方法获取该项目的默认命名空间:

// project is of type: EnvDTE.Project
string strDefaultNamespace = project.Properties.Item( "DefaultNamespace" )
    .Value.ToString();

然后,随心所欲地strDefaultNamespace使用价值。

于 2013-04-13T00:36:59.070 回答