2012-08-17 11 views
5

Ésta es mi primera pregunta en StackOverflow por lo Hola :)plantilla de T4 y Assembly.Load

¿Es posible cargar el ensamblado por su nombre usando Asamblea Assembly.Load() en la plantilla T4? Me gustaría utilizarlo para obtener todos los tipos con el atributo ServiceContract en el ensamblaje cargado.

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

Asamblea deseada se hace referencia en el proyecto donde está mi plantilla. Descubrí que

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

funciona pero no parece una buena solución. Además quiero esa plantilla para transformar tras la compilación y cuando agrego siguientes líneas a .csproj

solución
 <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> 

con Assembly.GetAssembly no funciona bien. Gracias por todas las sugerencias.

+0

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

+0

¡Oh, guau! Su caso es exactamente el mismo que el mío, ¡hasta la verificación del atributo wcf! ¿Has resuelto esto? Estoy intentando cargar un ensamblaje manualmente usando ShadowCopy para evitar problemas de bloqueo en los dlls usados ​​dentro de la plantilla T4. – julealgon

+0

@julealgon desafortunadamente no. Lo hago manualmente cada vez que sé que el resultado cambia. –

Respuesta

0

que tenían el mismo problema usando la directiva Microsoft.TextTemplating.targets. Puede agregar el comando de transformación al final de .csproj como una posible solución 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> 
Cuestiones relacionadas