2010-08-08 14 views
30

Tengo el siguiente código en una clase de prueba en mi ensamblaje principal, PocoGenerator. Se supone que este ensamblaje utiliza una plantilla T4 para generar POCO basado en entidades L2S en un conjunto referenciado (una referencia de proyecto), DataObjects.No se puede hacer referencia a un conjunto en una plantilla T4

var assemblyName = "DataObjects"; 
var dataObjects = AppDomain.CurrentDomain.Load(new AssemblyName(assemblyName)); 

Probar como puedo, no puedo obtener T4 para encontrar el ensamblado DataObjects. He intentado varias formas de assembly directivas, como:

<#@ assembly name="DataObjects" #> 
<#@ assembly name="DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" #> 

en vano. El código anterior funciona en la clase de prueba, pero no en la plantilla. ¿Qué estoy haciendo mal?

Añadido: I han resuelto este problema mediante el uso de la ruta absoluta al conjunto en lugares bot I referencia a ella, la Directiva, así como el bloque de función de clase, es decir,

<#@ assembly name="C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll" #> 

y

var sourceAssembly = Assembly.LoadFile(@"C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll"); 

Pero realmente no me gusta esto, ya que me gustaría utilizar esta plantilla en varios proyectos, y simplemente odio la duplicación, especialmente de cadenas mágicas.

+0

Su proyecto de plantilla debe tener una referencia de proyecto al proyecto que tiene una dependencia. Su etiqueta de "ensamblado" de arriba se ve bien. Y también debería tener una referencia de "importación" también. ¿Qué mensaje de error exacto está recibiendo? (y ¿qué pasa con el elemento AppDomain? no debería tener que hacer algo como eso) –

+0

El elemento de AppDomain es tp, permítame iterar todos los tipos en uno de los ensamblajes cargados en el AppDomain actual. No tiene nada que ver con hacer referencia al ensamblaje de la plantilla en sí. – ProfK

+0

Sí, ahora veo. ¿Y qué mensaje de error exacto estás recibiendo? –

Respuesta

54
<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #> 

Codificación feliz!

+1

Aunque tenga en cuenta que esta es una característica solo de VS2010 – GarethJ

+30

O incluso mejor: '<# @ assembly name =" $ (ProjectDir) $ (OutDir) $ (TargetFileName) "#>' –

+13

Más simple: '<# @ Assembly name =" $ (TargetPath) "#>' – pylover

1

Tuve un problema similar cuando traté de incluir Less Css for .NET en mi proyecto web.

Terminé copiando el ensamblaje en la carpeta raíz de mi proyecto y lo incluyo como referencia en el proyecto. Entonces, he añadido las siguientes líneas en el archivo .tt:

<#@ assembly name="dotless.Core.dll" #> 

<#@ import namespace="dotless.Core" #> 
<#@ import namespace="dotless.Core.configuration" #> 

Estoy seguro de que algo similar debe trabajar con su montaje, así ...

0

he encontrado que hay una número de casos en la creación y uso de gax toolkit y paquetes donde la compilación está perfectamente satisfecha con la forma en que se estructuran las referencias, pero el tiempo de ejecución se molesta porque no puede encontrar lo que busca; esto ocurre cuando el ensamblaje principal hace referencia a ensamblaje que usa elementos gax y luego ese ensamblaje a su vez hace referencia a otro ensamblaje que el principal no.

intente directamente incluir el ensamble en cuestión en su ensamblaje principal, y considere que puede necesitar escribir instrucciones posteriores a la compilación para moverlo a una ubicación 'esperada', mientras que una nusiancia, debe superar tener que conectar la ruta.

YMMV

14

Para hacer referencia de montaje en la plantilla T4 en VS2010 usted tiene algunas opciones:

  1. GAC sus asambleas y el uso de espacio de nombres de referencia o de tipo completo Nombre
  2. utilizar una ruta UNC completa codificada
  3. Copie el ensamblaje a la "Carpeta de ensamblados públicos" de Visual Studio y use la Referencia de espacio de nombres o el Nombre de tipo totalmente calificado.
  4. Utilice o defina una variable de entorno de Windows para compilar una ruta UNC totalmente calificada.
  5. Utilice una macro de Visual Studio para crear una ruta UNC totalmente calificada.

Yo sugeriría que se pone un ensamblaje de referencia en su Asambleas de carpetas públicas, otro, tal vez incluso mejor solución sería la de codificar el camino de sus ensamblados de referencia.

Muy buen post sobre este tema: T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project.

Básicamente MS decidió el cambio del freno, que los conjuntos de referencia del proyecto no son referenciados por el motor T4, también.

El conjunto de montaje de T4 está completamente separado del conjunto de montaje del proyecto que lo contiene para evitar recoger los ensamblajes incorrectos cuando un proyecto se dirige a versiones de marco anteriores. Los ensambles de proyectos ya no se usan para resolver directivas de ensamblaje de plantillas.

Más sobre esto: What's new in T4 in Visual Studio 2010

+0

+1 para que la referencia del proyecto no se usara más, ¡eso me estaba matando! – dbones

+0

@ Peter Stegnar Formulo una pregunta relacionada aquí: http://stackoverflow.com/questions/13838142/put-all-methods-in-one-tt-file-and-use-it-in-another-t4-files -en-codetemplates ¿podría comprobarlo? – Saeid

Cuestiones relacionadas