2014-10-24 9 views
5

ho bisogno di fare riferimento a un tipo in uno dei gruppi a cui fa riferimento il progetto che contiene il mio visivo modello Studio T4. Tuttavia, l'assembly di riferimento viene installato da un pacchetto NuGet. Man mano che la referenza Nuget si evolve, anche il percorso che NuGet inserisce nella cartella dei pacchetti della mia soluzione. Ad esempio, supponiamo che il mio pacchetto NuGet è:Caricamento di un assemblaggio NuGet nel T4 template

  • Facade.Contract.1.0.1-alfa

Poi il percorso relativo ad esso dal mio progetto è:

  • .. \ pacchetti \ Facade.Contract.1.0.1-alpha \ lib \ NET4 \ Facade.Contract.dll

Se la pre-release è stato aggiornato alla versione beta, che percorso cambieranno. Quando il pacchetto viene rilasciato, il percorso cambierà. E ogni volta il percorso cambia, la catena di montaggio nel mio file .tt * non è aggiornato:

  • < # @ nome assembly =" .. \ pacchetti \ Facade.Contract.1.0.1-alpha \ lib \ NET4 \ Facade.Contract.dll" #>

non credo ci sia un modo per ottenere questo direttamente con la direttiva di montaggio; tuttavia, sono aperto ad alcune idee pazze. Posso caricare l'assembly da solo nel corrente, o un AppDomain subordinato o solo riflessione?

penso di poterlo fare, ma non sono sicuro di come fare per scoprire dinamicamente il percorso per l'assemblaggio si fa riferimento nel riferimenti del progetto usando la logica T4.

Qualche idea?

+1

come stai eseguendo i modelli T4, si corrono all'interno di Visual Studio o durante la costruzione utilizzando msbuild? – Frank

+0

Si esegue all'interno di Visual Studio (a differenza di quello che ho detto nella mia modifica ... correggo il prima possibile). Quindi dovrei avere accesso all'intero DTE. – Trinition

+0

Sto facendo un piccolo progresso usando VSLangProj per scoprire i percorsi di riferimento, dopo essere stato ispirato da questo articolo: http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project- from-t4-template.html – Trinition

risposta

3

ho trovato una soluzione che utilizza VSLangProject come suggerito da questo articolo: http://t4-editor.tangible-engineering.com/blog/add-references-to-visual-studio-project-from-t4-template.html

Data una stringa serviceContractReferenceAssembly una per identificare il nome del gruppo di riferimento nel mio progetto che contiene, e serviceContractReferenceType per identificare la tipo all'interno di tale assemblea, i seguenti lavorato:

var templateItem = dte.Solution.FindProjectItem(this.Host.TemplateFile); 
    var project = templateItem.ContainingProject; 
    var vsProject = project.Object as VSLangProj.VSProject; 
    foreach(var referenceObj in vsProject.References) 
    { 
     var reference = (VSLangProj.Reference)referenceObj; 
     if(reference.Name != serviceContractReferenceAssembly) continue; 
     var serviceContractAssembly = Assembly.LoadFile(reference.Path); 
     var serviceContractType = serviceContractAssembly.GetType(serviceContractReferenceType); 
     // Do something with it here 
    } 
2

Il team Nuget ha reso disponibile un'estensione che permette un certo controllo sui pacchetti in una soluzione/progetto. Quindi, se hai il controllo sull'ambiente e puoi essere sicuro che tutti hanno installato this potresti essere in grado di cercare i pacchetti installati e caricarli dinamicamente durante l'esecuzione di T4. Dato che questi assembly Nuget sono già rispettati e non fanno parte della vostra soluzione/progetto, penserei che l'utilizzo dello standard Assembly.Load funzionerebbe, ma sarebbe necessario testarlo.

Problemi correlati