좋아, 나는 그의 제안을 사용하지는 않지만, @FuleSnabel이 나에게 힌트를 준 어셈블리에 필요한 참조를 얻을 수 있었다.
<#@ 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()
방법으로 프로젝트에 대한 참조를 얻을 다음 prj.Properties.Item("OutputFileName").Value
와 프로젝트의 속성 OutputFileName
를 사용했다 :
여기 내 T4 템플릿의 일부입니다. 프로젝트 속성이있는 곳을 찾을 수 없기 때문에 열거와 루프를 사용하여 Properties
컬렉션을 검사 한 다음 필요한 것을 찾았습니다. 루프 코드는 다음과 같습니다.
<#
// ....
foreach(Property prop in prj.Properties)
{
#>
<#= prop.Name #>
<#
}
// ....
#>
이 정보가 도움이되기를 바랍니다.
var path = this.Host.ResolveAssemblyReference("$(TargetPath)");
var asm = Assembly.LoadFrom(path);
은 또한 당신은 단계 편집기를 구축 프로젝트 psot에서
$(...)
호텔을 찾을 수 : 간단한 코드에 따라
는
하나의 가능성은 .csproj 파일을 찾고 구문 분석하고 빌드 출력 경로를 추출하는 것입니다. 그것은 XML 파일입니다. – FuleSnabel
흠 ... 네, 아마도, 좋은 지적입니다. 나는 시도 할 것이다. – Kosta