2012-12-20 4 views
6

T4 템플릿이있는 프로젝트의 어셈블리에 대한 참조를 얻고 싶습니다. 예를 들어 Host.ResolveAssemblyReference("$(ProjectDir)")과 같이 프로젝트 경로를 얻을 수 있다는 것을 알고 프로젝트 이름으로 어셈블리 이름이 지정 되었기 때문에 bin\\debug\\{projectName}.dll을 추가 할 수는 있습니다.하지만 항상 그런 것은 아니며 재사용 가능한 템플릿을 만들어서 경로가 필요합니다. dll 또는 가장 바람직하게는 Assembly 인스턴스. Project에 대한 참조를 얻는 방법을 찾았으니 GetProjectContainingT4File 방법으로 here으로 설명했는데 그 다음은 무엇입니까?T4 템플릿 VS2010 호스트 어셈블리 가져 오기

얻을 수있는 방법이 있습니까?

지금까지 특정 형식에 액세스하여 코드를 생성하려면 해당 참조가 필요합니다.

+0

하나의 가능성은 .csproj 파일을 찾고 구문 분석하고 빌드 출력 경로를 추출하는 것입니다. 그것은 XML 파일입니다. – FuleSnabel

+0

흠 ... 네, 아마도, 좋은 지적입니다. 나는 시도 할 것이다. – Kosta

답변

9

좋아, 나는 그의 제안을 사용하지는 않지만, @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에서 $(...) 호텔을 찾을 수 : 간단한 코드에 따라

+0

감사합니다; 이것은 단지 도로의 시작 부분에있는 작은 충돌 위에 나를 밀었습니다. – TeaDrivenDev

9

(2013 VS) 날 위해 일했습니다.

+0

소원 나는 이것을 이중 upvote 수 있습니다. 감사! – Mitch