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

C# T4模板:在主机程序集中导入命名空间,c#,t4,C#,T4,全部, 我有一个T4模板 <#@ template debug="true" hostSpecific="true" #> <#@ output extension=".cs" #> <#@ Assembly Name="System.Core" #> <#@ Assembly Name="System.Windows.Forms" #> <#@ import namespace="System" #> <#@ import na

全部,

我有一个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个代码段以获取包含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;
#>

然后,可以随意使用strDefaultNamespace值。

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

如果您想引入宿主项目的程序集,则需要一个程序集指令来实现。如下所示:


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

无论是
System.Core
还是
System.Windows.Forms
程序集都不包含命名空间
MyLibrarysRootNameSpace.SomeNamespace
,因此很明显导入失败。您到底想实现什么?MyLibrarysRootNameSpace.SomeNamespace是指在我自己的代码中包含类定义的命名空间。它是宿主项目的一部分,而不是任何系统名称空间的一部分(这就是为什么它以My这个词开头)。我希望它更像是一个指令,而不是字符串文字。这将获得名称空间,但程序集仍然没有被引用。您可以使用System.IO.StreamWriter类编写单行ImportDefaultNamespace.tt文本文件,然后使用
,或者,如果您没有共享代码/接口,您将无法重用T4,因为它无法编译。自动命名空间导入不提供任何内容,除非命名空间包含从T4源代码调用的类。或者,如果在T4中只对数据类型使用反射而不直接调用它们,则不需要导入任何名称空间。@GarethJ,可以使用相同的方法添加引用。若要获取输出路径,请查询“OutputFileName”项目属性。我会将此标记为答案,即使正如您所说的,它会导致生成循环。结果表明,我认为类型比较所需的内容并不那么重要。导入只是添加了一个using语句。明确地说,它导入了一个名称空间;它不会将using语句写入输出文件。(可能是您的意思。)它将using语句添加到中间代码中,中间代码被编译和执行以生成输出文件。
// project is of type: EnvDTE.Project
string strDefaultNamespace = project.Properties.Item( "DefaultNamespace" )
    .Value.ToString();