在T4模板中加载NuGet程序集

时间:2014-10-24 20:53:01

标签: nuget .net-assembly t4

我需要在包含我的Visual Studio T4模板的项目引用的程序集之一中引用Type。但是,引用的程序集是从NuGet包安装的。随着Nuget引用的发展,NuGet将其放入我的解决方案包文件夹中的路径也将如此。例如,假设我的NuGet包是:

  • Facade.Contract.1.0.1-α

然后我项目的相对路径是:

  • .. \包\ Facade.Contract.1.0.1-α\ lib中\ NET4 \ Facade.Contract.dll

如果预发行版更新为测试版,则该路径将更改。当包被释放时,路径将改变。每次路径更改时,* .tt文件中的装配线都已过期:

  • <#@ assembly name =" .. \ packages \ Facade.Contract.1.0.1-alpha \ lib \ net4 \ Facade.Contract.dll" #>

我认为没有办法直接用汇编指令来完成这个任务;但是,我对一些疯狂的想法持开放态度。我可以将程序集自己加载到当前,或者是从属或仅反射的AppDomain吗?

我想我可以,但我不确定如何使用T4逻辑动态发现项目引用中引用程序集的路径。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我已经找到了使用VSLangProject的解决方案,如本文所述:http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project-from-t4-template.html

给定一个字符串 serviceContractReferenceAssembly a来标识包含项目中引用程序集的名称,并使用 serviceContractReferenceType 来标识该程序集中的类型,以下方法有效: / p>

    var templateItem = dte.Solution.FindProjectItem(this.Host.TemplateFile);
    var project = templateItem.ContainingProject;
    var vsProject = project.Object as VSLangProj.VSProject;
    foreach(var referenceObj in vsProject.References)
    {
        var reference = (VSLangProj.Reference)referenceObj;
        if(reference.Name != serviceContractReferenceAssembly) continue;
        var serviceContractAssembly = Assembly.LoadFile(reference.Path);
        var serviceContractType = serviceContractAssembly.GetType(serviceContractReferenceType);
        // Do something with it here
    }

答案 1 :(得分:2)

Nuget团队提供了一个扩展程序,允许您对解决方案/项目中的程序包进行一些控制。因此,如果您可以控制环境并且可以确保每个人都安装了this,那么您可以搜索已安装的软件包,然后在T4执行期间动态加载它们。由于这些Nuget程序集已经编译并且不是您的解决方案/项目的一部分,我认为使用标准Assembly.Load会起作用,但您需要对其进行测试。