2014-05-09 17 views
5

Sto riscontrando problemi nella creazione di un modello T4 che può essere utilizzato per generare un codice C# relativamente semplice sia da Visual Studio sia da MSBUild. Il modello fa riferimento a una DLL, che risiede nel percorso di output del progetto. A parte questo, è un modello abbastanza semplice che scorre attraverso una collezione di oggetti di dominio e genera un metodo di prova per ognuno di essi.T4: utilizzo delle proprietà sia in Visual Studio che in MSBuild

MSDN suggests il seguente approccio per l'utilizzo di immobili a entrambi gli host:

<!-- Define a project property, myLibFolder: --> 
<PropertyGroup> 
    <myLibFolder>$(MSBuildProjectDirectory)\..\libs</myLibFolder> 
</PropertyGroup> 

<!-- Tell the MSBuild T4 task to make the property available: --> 
<ItemGroup> 
    <T4ParameterValues Include="myLibFolder"> 
     <Value>$(myLibFolder)</Value> 
    </T4ParameterValues> 
    </ItemGroup> 

Purtroppo, questo semplicemente non funziona. Quando si esegue tramite MSBuild, ottengo il seguente errore:

Compiling transformation: Metadata file '$(myLibFolder)Cmc.SpeedWays.Core.Testing.dll' could not be found 

Qualcuno ha riescono a risolvere questo problema, o almeno trovare una soluzione accettabile? Stiamo usando VS2012 e MSBUild 4.0.

risposta

1

Ho avuto lo stesso problema e mi dispiace dire che non ho ricevuto una sola ovvia soluzione. Tuttavia il problema è andato via, sembra una raccolta di possibili problemi.

Penso che il principale fosse questo tipo di dichiarazione di proprietà funziona solo se si crea la soluzione/progetto con MSBuild, se si utilizza Visual Studio, le proprietà saranno null. Penso che questa sia stata la confusione per me. Alla fine ho finito con tappe a mio modello, dove cerco di ottenere il MSBuild dichiarato di proprietà, e se questo viene a mancare, come VS

var configName = Host.ResolveParameterValue("-", "-", "configuration"); 
if (String.IsNullOrEmpty(configName)==true) 
{ 
    WriteLine ("// Generated from Visual Studio"); 
    IServiceProvider serviceProvider = (IServiceProvider)this.Host; 
    DTE dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
    configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name ; 
} 

Altra cosa a cui prestare attenzione è la costruzione stringhe non valide con concatenazione di stringhe, facile finire con un nulla