2012-12-20 10 views
6

Ich möchte einen Verweis auf die Assembly eines Projekts, in dem T4-Vorlage ist. Ich weiß, dass ich Pfad zu dem Projekt mit, zum Beispiel Host.ResolveAssemblyReference("$(ProjectDir)") bekommen kann und ich könnte bin\\debug\\{projectName}.dll hinzufügen, weil meine Assemblynamen nach Projektname benannt werden, aber das ist nicht immer der Fall, und ich erstelle wiederverwendbare Vorlage, also brauche ich Pfad zu DLL oder am meisten bevorzugt Assembly Instanz. Ich habe auch gefunden, wie Bezug auf die Project wie erläutert here in Methode GetProjectContainingT4File bekommen, aber was dann?T4 Vorlage VS2010 Host-Assembly

Gibt es eine Möglichkeit, es zu bekommen?

BTW, ich brauche diese Referenz für den Zugriff auf bestimmte Typen und generieren Sie einige Code von ihnen.

+0

Eine Möglichkeit besteht darin, die .csproj-Datei zu finden, zu analysieren und den Build-Ausgabepfad zu extrahieren. Es ist eine XML-Datei. – FuleSnabel

+0

hm ... ja, ich könnte wahrscheinlich, guter Punkt. Ich werde es versuchen. – Kosta

Antwort

9

Ok, ich habe es geschafft, die benötigte Referenz zur Assembly zu bekommen @FuleSnabel gab mir einen Hinweis, obwohl ich seinen Vorschlag nicht verwendet habe.

Hier ist ein Teil meiner T4-Vorlage:

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

, also richtigen Weg Montage finden musste ich Verweis auf das Projekt in GetProject() Methode und dann Eigenschaft Projekt OutputFileName mit prj.Properties.Item("OutputFileName").Value. Da ich nirgends finden konnte, welche Eigenschaften Projekt hat, habe ich Aufzählung und eine Schleife inspiziert Properties Sammlung und dann gefunden, was ich brauche. Hier ist eine Schleife Code:

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

Ich hoffe, das jemand helfen.

+0

Danke; Das hat mich am Anfang der Straße einfach über eine kleine Beule geschoben. – TeaDrivenDev

9

einfachen Code Nach arbeitete für mich (VS 2013):

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

Sie können auch $(...) Eigenschaften in Projekt psot Erstellungsschritte Editor finden.

+0

Ich wünschte, ich könnte das verdoppeln. Vielen Dank! – Mitch

Verwandte Themen