2013-06-06 6 views
37

Ciao Ho bisogno di aggiungere l'assemblaggio di un progetto esistente nella mia soluzione nel mio file modello T4. Il problema è che il mio modello T4 si trova in un progetto chiamato Project.WebApi e la classe di cui ho bisogno nel mio modello T4 si trova all'interno di un progetto chiamato Project.Common.WebApi.Modello T4 che aggiunge il montaggio del progetto esistente nella soluzione

Ho provato l'importazione del namespace in questo modo:

<#@ import namespace="Project.Common.WebApi.T4TemplateAttribute" #> 

ma ottengo questo errore:

The type or namespace name 'Project' could not be found (are you missing a using directive or an assembly reference?) 

Ho provato aggiungendo il gruppo in questo modo:

<#@ assembly name="Project.Common.WebApi" #> 

E Ho ricevuto questo errore:

Compiling transformation: Metadata file 'Project.Common.WebApi' could not be found 

Il mio progetto che contiene il T4Template (Project.WebApi) ha un riferimento al Project.Common.WebApi ma da quello che ho letto T4Template non usa i riferimenti nei progetti.

Come posso risolvere questo problema?

risposta

60

T4 funziona quasi completamente indipendente dal resto del codice. Tuttavia, sei sulla strada giusta, con la direttiva assembly, ma dovrai specificare un percorso completo per la DLL effettiva dell'assembly, a meno che l'assembly non sia nel GAC (che probabilmente non è).

Fortunatamente, tuttavia, è possibile utilizzare i macro di MSBuild nelle direttive T4. Quindi, probabilmente otterrete qualcosa di simile

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\bin\Debug\Project.Common.WebApi.dll" #> 

Vedere MSDN per un po 'più di fondo su questa sintassi.

È inoltre necessaria la direttiva import namespace.

Infine, fai attenzione all'ordine di costruzione del progetto. Il progetto che contiene il tuo modello T4 ora dipende da Project.Common.WebApi, quindi dovrai assicurarti che Project.Common.WebApi sia stato creato per primo. In caso contrario, il tuo modello T4 potrebbe accidentalmente collegarsi a una versione precedente dell'assieme, rendendo i bug veramente difficili da tracciare.

Se si dispone già di un riferimento al progetto, è tutto fatto, ma altrimenti è necessario impostare correttamente le dipendenze. Puoi farlo in Visual Studio tramite la finestra di dialogo "Dipendenze del progetto ...". Fare clic con il tasto destro del mouse sul progetto per trovarlo.

+2

Dovrebbe essere '$ (SolutionDir) Project ...' invece di '$ (SolutionDir) \ Project ...' perché '$ (SolutionDir)' aggiunge già la barra retroversa finale. – CallMeLaNN

+0

Buono! Modificato la risposta. Grazie! – skrebbel

+3

dovrebbe anche essere $ (ConfigurationName) invece di Debug – Nahum

19

Nel caso in cui il vostro progetto con template T4 ha diretto riferimento al progetto, è possibile utilizzare $ (TargetDir)

< # @ assemblaggio name = "$ (TARGETDIR) Project.Common.WebApi.dll "#>

+0

Questa soluzione ha funzionato per me. È necessario che T4 e DLL si trovino nello stesso progetto o che il progetto che contiene T4 faccia riferimento al progetto DLL in modo che venga copiato. – Andrea

+0

bello, questo ha funzionato perfettamente –

1

Solo nel caso si stesse utilizzando C#

penso che sarebbe:

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\\bin\\Debug\\Project.Common.WebApi.dll" #> 

Utilizzare una doppia barra.

14
<#@ assembly name="$(TargetPath)" #> 

Semplice.

+0

Buona, soluzione corta! –

+0

Questo è molto più semplice, vai su :) – Bartosz

Problemi correlati