2009-12-06 4 views
14

J'ai un projet C# qui comprend un modèle de texte. Je voudrais que ce modèle génère du SQL basé sur la réflexion sur les classes C# du projet.Comment utilisez-vous .net Reflection avec T4?

Comment accéder au contenu du projet actuel en utilisant T4? Est-ce possible, et si oui, est-ce que Reflection est disponible, ou est-ce l'accès à la source brute qui doit ensuite être analysée?

Merci d'avance!

+2

Dupliquer de http://stackoverflow.com/questions/1153542/t4-code-generation-access-types-in-current-project? –

Répondre

4

Comment accéder au contenu du projet actuel en utilisant T4?

Une façon consiste à utiliser le composant EnvDTE COM. Googling T4 et EnvDTE devraient rapporter beaucoup d'exemples.

Est-il possible, et si oui, est disponible réflexion, ou est-il un accès juste la source première qui doit ensuite être analysé?

La réflexion est clairement disponible à partir de T4. Cela fonctionne la plupart du temps comme prévu.

Oleg Sych a un certain nombre de grandes entrées de blog concernant les scénarios d'utilisation de T4 commun, mais il y a beaucoup d'autres ressources pour les T4 là-bas aussi.

+0

La réflexion est généralement considérée comme une mauvaise méthode via T4 car elle verrouille les fichiers ou l'assemblage de sorte que vous ne pouvez pas l'éditer, le COM EnvDTE n'a pas cette limitation – Maslow

+0

@Maslow: Chaque fois que vous accédez à une DLL depuis T4 dans Visual Studio (réflexion ou non), la DLL est verrouillée et ne peut pas être facilement modifiée sans fermer Visual Studio et la rouvrir. Personnellement, je considère qu'un bogue dans l'implémentation de Visual Studio T4 (Microsoft argumenterait probablement qu'il s'agit d'une fonctionnalité de mise en cache). Le verrou se produit également avec EnvDTE, mais vous n'essayez pas de changer cette DLL, donc vous ne remarquez pas qu'il a été verrouillé et cela n'a pas d'importance. Ce problème de verrouillage n'a rien à voir avec la réflexion, il arrive même quand vous n'utilisez pas la réflexion. –

+0

@Michael - Oleg Sync dit spécifiquement de ne pas utiliser la réflexion à partir de T4 http://stackoverflow.com/questions/1153542/t4-code-generation-access-types-in-current-project Je ne connais pas le raisonnement, et peut-être que le contexte était différent, mais c'est ce que j'ajoutais à ce sujet, j'aurais dû trouver le lien et l'inclure dans le commentaire initial. – Maslow

0

Bien que cela ne marche pas à résoudre les problèmes de verrouillage (bien que ive entendu que VS2010 ne), vous pouvez essayer de copier le dll à un emplacement temporaire et il suffit d'utiliser cet ensemble copié ..

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System.IO" #> 
<#  
var newFileName = System.IO.Path.GetTempFileName(); 
System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true); 

var assembly = Assembly.LoadFrom(newFileName); 
var type = assembly.GetType("CustomAssembly.DummyClass"); 
#> 
<#=newFileName#> 
<#=type#> 
+0

Oui cela évite de verrouiller le fichier d'origine, mais l'AppDomain charge l'assemblage une fois et ne le chargera plus (quel que soit le nom du fichier). J'ai été infructueux dans le chargement du fichier dans un nouveau domaine d'application dans le but de le décharger à nouveau lorsque vous avez terminé. –

+0

Charger l'assemblage en tant que tableau d'octets à l'aide d'un flux sous-jacent – sll

4

complètement de côté des problèmes de verrouillage , soyez prudent en utilisant la réflexion dans un gabarit T4. Le générateur de modèles dans VS2010 fonctionne avec la version 4.0 du Framework, de sorte que vous pouvez introduire des dépendances non désirées si vous générez du code pour 3.5 ou moins. Je viens de le découvrir à la dure, après avoir utilisé la réflexion pour décider de générer des appels sans paramètre ou paramétrés à ToString pour différents types de BCL. TimeSpan a seulement ToString() dans 2.0, mais 4.0 ajoute ToString(string): P