Plantilla T4 añadiendo montaje de proyecto existente en solución


Hola Necesito agregar el ensamblado de un proyecto existente en mi solución en mi archivo de plantilla T4. El problema es que mi plantilla T4 está en un proyecto llamado Proyecto.WebAPI y la clase que necesito en mi plantilla T4 está dentro de un proyecto llamado Project.Común.WebAPI.

He intentado importar el espacio de nombres de esta manera:

<#@ import namespace="Project.Common.WebApi.T4TemplateAttribute" #>

Pero obtengo este error:

The type or namespace name 'Project' could not be found (are you missing a using directive or an assembly reference?)   

He intentado agregar la asamblea de esta manera:

<#@ assembly name="Project.Common.WebApi" #>

Y tengo este error:

Compiling transformation: Metadata file 'Project.Common.WebApi' could not be found

Mi proyecto que contiene el T4Template (Proyecto.WebAPI) tiene una referencia al Proyecto.Común.WebAPI pero por lo que he leído T4Template no utiliza las referencias en los proyectos.

¿Cómo puedo resolver estos problemas?

 39
Author: aleczandru, 2013-06-06

4 answers

T4 funciona casi completamente independiente del resto de su código. Sin embargo, está en el camino correcto, con la directiva assembly, pero necesitará especificar una ruta completa a la DLL real del ensamblado, a menos que el ensamblado esté en el GAC (que probablemente no lo esté).

Afortunadamente, sin embargo, puede usar macros MSBuild en directivas T4. Por lo tanto, probablemente obtendrá algo como

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\bin\Debug\Project.Common.WebApi.dll" #>

Ver MSDN para más información sobre esta sintaxis.

Usted todavía también necesita el import namespace directiva.

Finalmente, tenga cuidado con el orden de construcción del proyecto. El proyecto que contiene tu plantilla T4 ahora depende del Proyecto.Común.WebAPI, por lo que tendrá que asegurarse de que el Proyecto.Común.WebAPI se construye primero. De lo contrario, tu plantilla T4 podría enlazarse accidentalmente a una versión anterior del ensamblado, haciendo que los errores sean realmente difíciles de rastrear.

Si ya tiene una referencia de proyecto, ya ha terminado, pero de lo contrario necesita configurar las dependencias correctamente. Puedes hacer esto en Visual Studio a través de las " Dependencias del proyecto..." diálogo. Haga clic derecho en el proyecto para encontrarlo.

 68
Author: skrebbel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 13:36:22

En caso de que su proyecto con plantilla T4 tenga referencia directa al proyecto, puede usar $(TargetDir)

 25
Author: czlatea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-05 17:02:15
<#@ assembly name="$(TargetPath)" #>

Tan simple como eso.

 17
Author: mitaness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-21 12:19:45

En caso de que esté usando C# use a double slash \\.

Creo que sería como:

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\\bin\\Debug\\Project.Common.WebApi.dll" #>
 1
Author: Assil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-04 16:52:51