2012-12-20 13 views
6

Desidero ottenere un riferimento all'assemblaggio di un progetto in cui è presente il modello T4. So che posso ottenere il percorso del progetto con, ad esempio Host.ResolveAssemblyReference("$(ProjectDir)") e potrei forse aggiungere bin\\debug\\{projectName}.dll perché i nomi dei miei assembly sono nominati per nome del progetto, ma non è sempre così e sto creando un modello riutilizzabile, quindi ho bisogno di un percorso per dll o più preferibilmente istanza Assembly. Ho anche trovato come ottenere il riferimento allo Project come spiegato here nel metodo GetProjectContainingT4File, ma che cosa?Modello T4 VS2010 ottenere il gruppo host

C'è un modo per ottenerlo?

BTW, ho bisogno di tale riferimento per accedere a tipi specifici e generare un codice da loro.

+0

Una possibilità è trovare il file .csproj, analizzarlo ed estrarre il percorso di output della build. È un file xml. – FuleSnabel

+0

hm ... sì, probabilmente potrei, buon punto. Ci proverò. – Kosta

risposta

9

Ok, sono riuscito a ottenere il riferimento necessario all'assembly @FuleSnabel mi ha dato un suggerimento, anche se non ho usato il suo suggerimento.

Ecco una parte del mio template 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; 
    } 
#> 

Così, per trovare il percorso giusto per il montaggio ho dovuto ottenere riferimento al progetto in GetProject() metodo e quindi utilizzare la proprietà del progetto OutputFileName con prj.Properties.Item("OutputFileName").Value. Dal momento che non sono riuscito a trovare da nessuna parte il progetto delle proprietà, ho usato l'enumerazione e un ciclo per ispezionare la raccolta Properties e ho trovato ciò di cui avevo bisogno. Ecco un codice di ciclo:

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

Spero che questo vi aiuterà qualcuno.

+0

Grazie; questo mi ha semplicemente spinto a un bernoccolo proprio all'inizio della strada. – TeaDrivenDev

9

seguito semplice codice ha lavorato per me (VS 2013):

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

Inoltre si possono trovare immobili a $(...) progetto psot costruire editor di passi.

+0

Vorrei poter raddoppiare questo. Grazie! – Mitch

Problemi correlati