6 votes

Modèles T4 : Importer un espace de nom dans l'assemblage hôte

Tous,

J'ai un modèle T4

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="MyLibrarysRootNameSpace.SomeNamespace" #>
/*Rest of template follows*/

J'essaie d'importer la dernière ligne afin de pouvoir réutiliser facilement ce modèle dans d'autres projets, mais il semble que quelque chose m'échappe. Ce que j'essaie de faire est-il possible ? Si oui, comment ?

11voto

GarethJ Points 4261

L'importation ajoute simplement une instruction using, elle ne référence pas l'assemblage. Le jeu d'assemblages référencés de T4 est complètement séparé du projet qui héberge le modèle.

Si vous souhaitez intégrer l'assemblage de votre projet d'hébergement, vous avez besoin d'une directive d'assemblage pour le faire. Quelque chose comme ce qui suit :

<#@ assembly name="$(TargetPath)" #>

Notez que vous introduisez une boucle de construction ici, donc le projet aura besoin d'une intervention manuelle pour être construit jusqu'à ce qu'il ait produit une DLL une fois, donc assurez-vous de ne générer que des partiels qui sont optionnels ou qui peuvent toujours utiliser la version précédente.

1voto

Soonts Points 3756

Si j'ai bien compris votre question :

Copier-coller les 2 premiers extraits à partir de là pour obtenir le modèle d'objet EnvDTE pour le projet qui contient le T4 :

<#@ assembly name="EnvDte" #>
<#
    var visualStudio = ( this.Host as IServiceProvider )
        .GetService( typeof( EnvDTE.DTE ) ) as EnvDTE.DTE;
    var project = visualStudio.Solution
        .FindProjectItem( this.Host.TemplateFile )
        .ContainingProject as EnvDTE.Project;
#>

Ensuite, utilisez la méthode à partir de là pour obtenir l'espace de nom par défaut de ce projet :

// project is of type: EnvDTE.Project
string strDefaultNamespace = project.Properties.Item( "DefaultNamespace" )
    .Value.ToString();

Ensuite, utilisez strDefaultNamespace valeur comme vous le souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X