我需要在包含我的Visual Studio T4模板的项目引用的程序集之一中引用Type。但是,引用的程序集是从NuGet包安装的。随着Nuget引用的发展,NuGet将其放入我的解决方案包文件夹中的路径也将如此。例如,假设我的NuGet包是:
然后我项目的相对路径是:
如果预发行版更新为测试版,则该路径将更改。当包被释放时,路径将改变。每次路径更改时,* .tt文件中的装配线都已过期:
我认为没有办法直接用汇编指令来完成这个任务;但是,我对一些疯狂的想法持开放态度。我可以将程序集自己加载到当前,或者是从属或仅反射的AppDomain吗?
我想我可以,但我不确定如何使用T4逻辑动态发现项目引用中引用程序集的路径。
有什么想法吗?
答案 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会起作用,但您需要对其进行测试。