2010-08-23 4 views
4

J'essaye d'écrire un code qui permet à un utilisateur de charger un assembly (fichier DLL), de choisir une interface dans cet assembly, puis de générer une classe héritant de cette interface, avec des stubs pour tous méthodes requises.Création dynamique d'une classe implémentant une interface

La classe serait générée dans un fichier ou dans une session VS active (le code est destiné à être utilisé dans un IWizard initialisé lors de la création d'un projet via un modèle personnalisé). Je suis arrivé au point où j'ai l'objet Type de l'interface, mais j'ai du mal à trouver la partie suivante, j'ai envisagé de parcourir les méthodes de l'interface en boucle et de les copier dans un texte fichier, en ajoutant les implémentations stub dans les endroits appropriés, mais je suis sûr qu'il y a une meilleure méthode, peut-être à travers un outil tiers?

Toute aide serait appréciée, Merci d'avance.

+3

VS fait déjà presque tout cela. Tapez 'class Foo: IFoo'. Placez le curseur sur 'IFoo' et appuyez sur' Ctrl' + '.'. VS va générer le code. –

+0

@CraigStuntz la génération automatique VS est plutôt bonne, mais il serait plus agréable de lui demander de générer des stubs qui redirigent les invocations vers un autre objet. –

Répondre

3

Si vous souhaitez créer un nouveau type lors de l'exécution, vous devez utiliser Reflection.Emit. Reflection.Emit vous permet d'émettre une langue intermédiaire directement dans l'AppDomain actuel (ou un assembly si vous préférez). Vous voudrez probablement utiliser le type en mémoire, donc vous ne voudrez peut-être pas créer un assemblage réel.

La création d'un nouveau type est effectuée avec la classe TypeBuilder.

CodeProject a une excellente introduction: http://www.codeproject.com/KB/dotnet/Creating_Dynamic_Types.aspx

MISE À JOUR:

Il a été porté à mon attention que l'objectif est d'ajouter un fichier de code C# pour un projet existant. Vous auriez toujours besoin de refléter dans l'assemblée et d'émettre IL, mais alors vous devriez "désassembler" l'IL en C#. Reflector is the #1 recommended tool for this, même si je ne suis pas sûr qu'il puisse être automatisé comme vous le souhaitez.

+1

La question concerne la génération du code source de la classe. Au moins c'est comme ça que je le lis. – Constantin

Questions connexes