【问题标题】:T4 template VS2010 get host assemblyT4模板VS2010获取主机组装
【发布时间】:2012-12-07 20:38:54
【问题描述】:

我想获得 T4 模板所在项目的程序集的参考。我知道我可以使用例如Host.ResolveAssemblyReference("$(ProjectDir)") 获取项目的路径,并且我可以添加bin\\debug\\{projectName}.dll,因为我的程序集名称是由项目名称命名的,但情况并非总是如此,我正在创建可重用的模板,所以我需要 dll 的路径,或者最好是 Assembly 实例。 我还发现了如何参考 Project 方法 here 在方法 GetProjectContainingT4File 中解释,但是然后呢?

有没有办法得到它?

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

【问题讨论】:

  • 一种可能性是找到 .csproj 文件,对其进行解析并提取构建输出路径。这是一个xml文件。
  • 嗯...是的,我可能可以,好点。我会试试的。

标签: c# visual-studio-2010 assemblies t4


【解决方案1】:

以下简单代码对我有用(VS 2013):

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

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

【讨论】:

  • 谢谢!我已经为此苦苦挣扎了几天,才发现您非常简单的代码!
【解决方案2】:

好的,我设法获得了对程序集的所需参考,@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 #>
    <#
}
// ....
#>

我希望这会对某人有所帮助。

【讨论】:

  • 谢谢;这只是让我在路的一开始就遇到了一个小颠簸。
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多