2012-08-17 24 views
5

Questa è la mia prima domanda su StackOverflow in modo Hi :)template T4 e Assembly.Load

E 'possibile caricare l'assembly in base al nome dell'Assemblea utilizzando Assembly.Load() nel template T4? Vorrei usarlo per ottenere tutti i tipi con l'attributo ServiceContract nell'assembly caricato.

var loadedAssembly = Assembly.Load(assemblyName); 
    var types = from type in loadedAssembly.GetTypes() 
    where Attribute.IsDefined(type, typeof(ServiceContractAttribute))select type; 

L'assieme desiderato è referenziato nel progetto in cui si trova il mio modello. Ho capito che

<#@ assembly name="$(TargetDir)\DesiredAssemblyName.dll" #> 
    var loadedAssembly = Assembly.GetAssembly(typeof(SomeType)); 

funziona ma non sembra una buona soluzione. Oltre Voglio che modello di trasformare dopo la generazione e quando aggiungo seguenti righe Csproj

 <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\ 
     TextTemplating\v10.0\Microsoft.TextTemplating.targets"/> 
     <PropertyGroup> 
     <TransformOnBuild>true</TransformOnBuild> 
     </PropertyGroup> 
     <ItemGroup> 
     <!--Add VS\...\PublicAssemblies to the list of places 
     to look for assemblies used by templates.--> 
     <T4ReferencePath Include="..\Onii.Vespa.AppServer\"/> 
     </ItemGroup> 

soluzione Assembly.GetAssembly non funziona neanche. Grazie per tutti i suggerimenti.

+0

Avete visto questo? http://stackoverflow.com/questions/3434713/cant-reference-an-assembly-in-a-t4-template – devlife

+0

Oh wow! Il tuo caso è esattamente uguale al mio, fino al controllo dell'attributo wcf! Hai risolto questo? Sto provando a caricare un assembly manualmente usando ShadowCopy per evitare problemi di blocco sulle DLL utilizzate all'interno del modello T4. – julealgon

+0

@julealgon sfortunatamente no. Lo faccio manualmente ogni volta che so che il risultato cambia. –

risposta

0

Ho avuto lo stesso problema usando la direttiva Microsoft.TextTemplating.targets. È possibile aggiungere il comando di trasformazione alla fine del .csproj come soluzione alternativa:

<Target Name="AfterBuild"> 
    <Exec Command="&quot;%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform&quot; -P &quot;..\Onii.Vespa.AppServer\&quot; -I &quot;$(ProjectDir.TrimEnd('\'))&quot; YourTemplate.tt" /> 
</Target>