2009-05-20 7 views
1

Disons que dans le constructeur de ma classe .NET, je veux écrire du code qui ajoutera des méthodes à ma classe dynamiquement. Alors maintenant, quand je réfléchis sur ma classe, je vais voir les méthodes où comme quand j'ai construit le projet les méthodes n'existaient pasComment ajouter du code à une DLL lors de l'exécution

Comment puis-je y parvenir?

que je suis à la recherche des CodeDom mais il est tout un peu confus

+0

Essayez-vous de développer des classes/code en dehors de l'EDI? – RSolberg

Répondre

0

Je ne peux pas imaginer .... pourquoi vous voulez faire.

Pourriez-vous expliquer pourquoi vous voudriez? Au lieu de cela, essayez d'avoir différentes implémentations concrètes de la même interface, ou classe abstraite si vous partagez la majeure partie du code.

+0

J'essaye d'accomplir ceci: http://stackoverflow.com/questions/885682/creating-udf-with-vsto-in-excel Lire la dernière phrase de la publication –

1

vous devez utiliser Reflection.Emit ou Mono.Cecil ou PostSharp.

Tous sont faciles à apprendre ...

3

Une fois que vous avez chargé l'assemblée, vous ne pouvez pas le changer. Vous pouvez utiliser Reflection.Emit ou CodeDom pour compiler dynamiquement un nouvel assemblage, avec une classe qui est exactement comme les vôtres + méthodes supplémentaires, mais cela ne changera pas la classe existante (au moins existante à l'exécution). Potentiellement, vous pourriez charger votre classe dans un AppDomain séparé, créer une nouvelle classe qui en était une "copie" avec les extras, puis charger cet assembly dans votre AppDomain principal (et décharger celui où vous avez chargé votre classe d'origine). Vous créez toujours une nouvelle classe, sans ajouter à une classe existante, mais l'effet serait similaire.

Vous pouvez toutefois utiliser l'injection de code pour insérer du code avant le chargement de la classe. Il existe des frameworks d'injection de code pour .NET qui pourraient vous aider ... mais c'est différent de votre question spécifique.

0

Vous pouvez le faire sans rien apprendre d'autre en utilisant CInject (open source chez Codeplex). Ecrivez le code à injecter dans C# ou VB.NET, puis récupérez-le dans CInject pour l'ajouter dans un assembly géré.

0

Je suis d'accord avec @ reed-copsey en utilisant les fonctions domdomplie d'appdomain. Vous pouvez créer une classe de plugin qui hérite d'une classe de base de plugin, vous pouvez ajouter toutes les classes que vous voulez. Quand il compile dans le domaine, il pourra même vous donner des erreurs de codage qui ont été injectées dans cette classe. Il ne compilera alors pas cette classe spécifique. Au moins, vous saurez que le code a un problème.

Questions connexes