2011-06-01 7 views
7

Miro y no veo.¿Cómo uso biblioteca/proyecto personalizado en la plantilla de texto T4?

Tengo una solución con dos proyectos: el proyecto A (una biblioteca) y el proyecto B, que es el proyecto principal y contiene la plantilla de texto T4.

Lo que hice hasta ahora - he añadido una referencia en el proyecto principal de A. He incluido como línea en plantilla de proyecto:

<#@ import namespace="MyProjectA" #> 

Sin embargo, todavía hay un error "transformación Compilación: El tipo o namespace name 'MyProjectA' no se pudo encontrar (¿falta una directiva using o una referencia de ensamblado?) "

Pregunta: ¿cómo puedo hacer referencia al proyecto A desde la plantilla de texto?

Tenga en cuenta: me gustaría hacer referencia a un proyecto dentro de la solución, no al archivo dll en el disco.

Respuesta

4

También necesita hacer referencia a la DLL utilizando la directiva "ensamblar". Por ejemplo:

<#@ assembly name=“System.Xml” #> 

Puede hacer referencia a archivos DLL por su camino, también. Vea la serie T4 de Oleg Sych para prácticamente cualquier cosa que quiera saber. Aquí está la página sobre la directiva de "ensamblaje": http://www.olegsych.com/2008/02/t4-assembly-directive/

Me temo que la plantilla T4 desconoce por completo la solución en la que vive, por lo que seguir haciendo referencia a otro proyecto en la solución tendrá que hacerse como una referencia dll. Si se establece el atributo HostSpecific en la directiva "plantilla" de esta manera:

<#@ template language="C#" debug="false" hostspecific="true" #> 

A continuación, al menos debería ser capaz de hacer el camino hasta el otro DLL relativa, aunque no he probado ese truco especial a mí mismo. Puede obtener la ruta al archivo T4 actual utilizando la propiedad Host.TemplateFile. Trate de usar este para construir la referencia DLL, tales como:

<#@ assembly name=Path.GetDirectoryName(Host.TemplateFile) + “..\OtherProject\bin\Debug\ClassLibrary1.dll” #> 

no puedo prometer que esto va a funcionar, pero vale la pena un tiro.

+0

Gracias, a partir de la explicación en el blog llegué a la conclusión la directiva de ensamblaje es simplemente alternativa a la referencia (por ejemplo, podría incluir el ensamblaje solo para una plantilla), y pensé que las referencias son vistas por T4. – greenoldman

+1

'hostspecific' y'Path.GetDirectoryName' se pueden evitar con '$ (SolutionDir)', ver [link] (http://msdn.microsoft.com/en-us/library/gg586946.aspx). Es una pena que no haya una solución más limpia que pueda autoconstruir el proyecto referenciado en la generación de texto si ha cambiado. –

10

Usando $(SolutionDir) referencias del proyecto a través de la DLL en la carpeta bin (única forma con la T4 debido a la forma en que resuelve los nombres de montaje)

<#@ assembly name="$(SolutionDir)MyProject\bin\Applications.Models.dll" #> 

(la solución anterior por Mel usando Path.GetDirectoryName no lo hizo el trabajo, así que pensé que me gustaría compartir mi experiencia)

+0

Éste funciona para mí en VS2013. –

Cuestiones relacionadas