web-dev-qa-db-fra.com

Modèle T4 ajoutant l'assemblage du projet existant dans la solution

Salut, je dois ajouter l'assemblage d'un projet existant dans ma solution dans mon fichier de modèle T4. Le problème est que mon modèle T4 se trouve dans un projet appelé Project.WebApi et la classe dont j'ai besoin dans mon modèle T4 se trouve dans un projet appelé Project.Common.WebApi.

J'ai essayé d'importer l'espace de noms comme ceci:

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

Mais je reçois cette erreur:

Le nom de type ou d'espace de nom 'Project' est introuvable (manque-t-il une directive using ou une référence d'assembly?)

J'ai essayé d'ajouter l'Assemblée comme ceci:

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

Et j'ai eu cette erreur:

Compilation de la transformation: le fichier de métadonnées "Project.Common.WebApi" est introuvable

Mon projet qui contient le T4Template (Project.WebApi) a une référence au Project.Common.WebApi mais d'après ce que j'ai lu, T4Template n'utilise pas les références dans les projets.

Comment puis-je résoudre ces problèmes?

45
aleczandru

T4 fonctionne presque complètement indépendamment du reste de votre code. Cependant, vous êtes sur la bonne voie, avec la directive Assembly, mais vous devrez spécifier un chemin complet vers le DLL DLL de l'assembly, sauf si l'assembly est dans le GAC (ce qui n'est probablement pas le cas).

Heureusement, cependant, vous pouvez utiliser des macros MSBuild dans les directives T4. Donc, vous obtiendrez probablement quelque chose comme

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

Voir MSDN pour plus d'informations sur cette syntaxe.

Vous avez également besoin du import namespace directive.

Enfin, méfiez-vous de l'ordre de construction du projet. Le projet qui contient votre modèle T4 dépend maintenant de Project.Common.WebApi, vous devrez donc vous assurer que Project.Common.WebApi est créé en premier. Sinon, votre modèle T4 pourrait accidentellement se lier à une ancienne version de l'assembly, rendant les bogues vraiment difficiles à suivre.

Si vous avez déjà une référence de projet, vous avez terminé, mais sinon vous devez configurer correctement les dépendances. Vous pouvez le faire dans Visual Studio via la boîte de dialogue "Dépendances du projet ...". Cliquez avec le bouton droit sur le projet pour le trouver.

76
skrebbel

Dans le cas où votre projet avec le modèle T4 a une référence directe au projet, vous pouvez utiliser $ (TargetDir)

<# @ Assembly name = "$ (TargetDir) Project.Common.WebApi.dll" #>

27
czlatea
<#@ Assembly name="$(TargetPath)" #>

Aussi simple que cela.

21
mitaness