Ok, tôi quản lý để có được tham chiếu cần thiết để lắp ráp @ FuleSnabel đã cho tôi một gợi ý, mặc dù tôi đã không sử dụng đề xuất của mình.
Dưới đây là một phần của mẫu T4 của tôi:
<#@ 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;
}
#>
Vì vậy, để tìm con đường đúng đắn để lắp ráp tôi đã phải nhận tài liệu tham khảo cho dự án trong GetProject()
phương pháp và sau đó sử dụng tài sản OutputFileName
của dự án với prj.Properties.Item("OutputFileName").Value
. Vì tôi không thể tìm thấy bất cứ nơi nào dự án bất động sản có, tôi sử dụng liệt kê và một vòng lặp để kiểm tra bộ sưu tập Properties
và sau đó tìm thấy những gì tôi cần. Đây là mã vòng lặp:
<#
// ....
foreach(Property prop in prj.Properties)
{
#>
<#= prop.Name #>
<#
}
// ....
#>
Tôi hy vọng điều này sẽ giúp một ai đó.
Một khả năng là tìm tệp .csproj, phân tích cú pháp và trích xuất đường dẫn đầu ra xây dựng. Đó là một tệp xml. – FuleSnabel
hm ... vâng, tôi có thể, điểm tốt. Tôi sẽ thử. – Kosta