2012-12-20 16 views
6

Chcę uzyskać odniesienie do zestawu projektu, w którym znajduje się szablon T4. Wiem, że mogę uzyskać ścieżkę do projektu z, na przykład, Host.ResolveAssemblyReference("$(ProjectDir)") i mógłbym dodać bin\\debug\\{projectName}.dll, ponieważ moje nazwy zespołów są nazwane według nazwy projektu, ale nie zawsze tak jest i tworzę szablon wielokrotnego użytku, więc potrzebuję ścieżki do dll lub najkorzystniej instancja Assembly. Znalazłem również, jak uzyskać odniesienie do Project, jak wyjaśniono here w metodzie GetProjectContainingT4File, ale co następnie?Szablon T4 VS2010 Uzyskaj zestaw hosta

Czy istnieje sposób, aby go zdobyć?

BTW, potrzebuję tego odniesienia, aby uzyskać dostęp do określonych typów i wygenerować z nich jakiś kod.

+0

Jedną z możliwości jest znalezienie pliku .csproj, przeanalizowanie go i wyodrębnienie ścieżki wyjściowej kompilacji. Jest to plik xml. – FuleSnabel

+0

hm ... tak, prawdopodobnie mógłbym, punkt dobry. Spróbuję. – Kosta

Odpowiedz

9

Ok, udało mi się uzyskać potrzebne odniesienie do montażu @FuleSnabel dał mi podpowiedź, chociaż nie skorzystałem z jego sugestii.

Oto część mojego szablonu T4:

<#@ 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; 
    } 
#> 

Tak więc, aby znaleźć właściwą drogę do montażu musiałem się odniesienie do projektu w GetProject() metody, a następnie użyć właściwości projektu OutputFileName z prj.Properties.Item("OutputFileName").Value. Ponieważ nie mogłem znaleźć nigdzie tego, co ma projekt własności, użyłem wyliczenia i pętli do sprawdzenia kolekcji Properties, a następnie znalazłem to, czego potrzebuję. Oto kod pętli:

<# 
// .... 
foreach(Property prop in prj.Properties) 
{ 
    #> 
    <#= prop.Name #> 
    <# 
} 
// .... 
#> 

Mam nadzieję, że to pomoże komuś.

+0

Dzięki; to tylko pchnęło mnie przez małe uderzenie na samym początku drogi. – TeaDrivenDev

9

wyniku prostego kodu pracował dla mnie (VS 2013):

var path = this.Host.ResolveAssemblyReference("$(TargetPath)"); 
var asm = Assembly.LoadFrom(path); 

Ponadto można znaleźć $(...) właściwości w psota projektu budowy edytora kroki.

+0

Żałuję, że nie mogę tego zrobić podwójnie. Dzięki! – Mitch

Powiązane problemy