T4模板VS2010获取主机汇编

本文关键字:主机 汇编 获取 VS2010 模板 T4 | 更新日期: 2023-09-27 17:49:02

我想获得一个项目的汇编参考,其中T4模板是。我知道我可以获得项目的路径,例如Host.ResolveAssemblyReference("$(ProjectDir)"),我可以添加bin''debug''{projectName}.dll,因为我的程序集名称是按项目名称命名的,但情况并非总是如此,我正在创建可重用的模板,所以我需要路径到dll或最好是Assembly实例。我也发现了如何获得Project的参考,正如方法GetProjectContainingT4File中所解释的那样,但是接下来呢?

有办法得到它吗?

顺便说一句,我需要这个引用来访问特定的类型并从中生成一些代码。

T4模板VS2010获取主机汇编

以下简单的代码为我工作(VS 2013):

var path = this.Host.ResolveAssemblyReference("$(TargetPath)");
var asm = Assembly.LoadFrom(path);

也可以在项目psot构建步骤编辑器中找到$(...)属性

好的,我设法得到了所需的汇编参考@FuleSnabel给了我一个提示,尽管我没有使用他的建议。

这是我的T4模板的一部分:

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".output" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Windows.Forms.dll" #>
<#@ Assembly Name="System.Xml.Linq.dll" #>
<#@ Assembly Name="Microsoft.VisualStudio.Shell.Interop.8.0" #>
<#@ Assembly Name="EnvDTE" #>
<#@ Assembly Name="EnvDTE80" #>
<#@ Assembly Name="VSLangProj" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ include file="T4Toolbox.tt" #>
<#
    Project prj = GetProject();
    string fileName = "$(ProjectDir)bin''debug''" + prj.Properties.Item("OutputFileName").Value;
    string path = Host.ResolveAssemblyReference(fileName);
    Assembly asm = Assembly.LoadFrom(path);
    // ....
#> 
// generated code goes here
<#+
    Project GetProject()
    {
        var serviceProvider = Host as IServiceProvider;
        if (serviceProvider == null) 
        {
            throw new Exception("Visual Studio host not found!");
        }
        DTE dte = serviceProvider.GetService(typeof(SDTE)) as DTE;
        if (dte == null) 
        {
            throw new Exception("Visual Studio host not found!");
        }
        ProjectItem projectItem = dte.Solution.FindProjectItem(Host.TemplateFile);
        if (projectItem.Document == null) {
            projectItem.Open(Constants.vsViewKindCode);
        }
        return projectItem.ContainingProject;
    }
 #>

所以,为了找到正确的装配路径,我必须在GetProject()方法中引用项目,然后使用项目的属性OutputFileNameprj.Properties.Item("OutputFileName").Value。因为我找不到任何地方的属性项目,我使用枚举和循环来检查Properties集合,然后找到我需要的。下面是一个循环代码:

<#
// ....
foreach(Property prop in prj.Properties)
{
    #>
    <#= prop.Name #>
    <#
}
// ....
#>

我希望这能帮助到大家。