2009-11-23 1 views
1

Fondamentalement, je veux être en mesure d'écrire une DLL pour mon application que je serai en mesure de mettre dans un dossier spécifique en utilisant un nom spécifique et au moment de l'exécution ont dll chargé et abonné à un événement spécifique. A titre d'exemple, j'ai une simple application Windows Form avec un seul bouton dessus. Je veux être en mesure d'avoir un MessageBox affiché lorsque l'événement de clic de bouton a lieu mais je veux que le message affiché soit contrôlé par une DLL externe qui est chargée au moment de l'exécution. Quel serait le meilleur moyen d'y parvenir?Câblage d'événements de dll chargés lors de l'exécution?

Répondre

3

Créer une interface qui comprend au moins une méthode pour gérer l'événement (votre application devra faire référence à l'ensemble dans lequel elle est définie):

public interface IEventHandler { 
    void HandleEvent(object sender, EventArgs e); 
} 

Ajouter une classe à la dll que vous voulez charger lors de l'exécution qui implémente l'interface:

public class ConcreteEventHandler: IEventHandler { 
    public void HandleEvent(object sender, EventArgs e) { 
     // do something here 
    } 
} 

Dans votre application, la réflexion de l'utilisation pour charger la dll et créer une instance de votre gestionnaire de béton (vérification d'erreur omis):

// The assembly name/location could be configurable 
Assembly  assembly = Assembly.Load("MyAssembly.dll"); 
// The type name could be configurable 
Type   type  = assembly.GetType("ConcreteEventHandler"); 
IEventHandler handler = Activator.CreateInstance(type) as IEventHandler; 

Vous pouvez accrocher ce gestionnaire jusqu'à ce que vous voulez, par exemple .:

MyButton.OnClick += handler.HandleEvent; 
+0

Merci. Quand j'arrive à la dernière ligne de votre exemple de code que je change de MyButton.OnClick + = handler.HandleEvent à MyButton.Click + = HandleEvent Je reçois l'erreur "Référence d'objet non définie à une instance d'un objet" sur cette ligne. Qu'est-ce que je rate? – etoisarobot

+0

Vous pouvez ignorer le commentaire ci-dessus concernant l'erreur de référence nulle. J'ai copié la DLL dans un répertoire sep pour l'importer à l'exécution, puis j'ai continué à travailler dans Visual Studio de sorte que la DLL sur laquelle je travaillais n'était pas la DLL sur laquelle je travaillais. Duh. Merci. Votre exemple était très utile. – etoisarobot

+0

C'est l'un des pièges éternels du chargement des assemblages 'pluggables' par réflexion - si vous pensez à un bon moyen de le contourner, faites le nous savoir! :) Le mieux que je puisse recommander est d'ajouter du code pour vérifier tout et de lancer des exceptions très spécifiques, comme: 'if (! File.Exists (assemblyPath)) {throw new FileNoteFoundException (string.Format (" Impossible de localiser l'assembly à {0 }. ", assemblyPath)); } '. (Et ajouter quelque chose de similaire pour le type, etc.) –

0

Est-ce que la DLL est une seule version connue ou en chargera-t-on des versions différentes ou multiples? Si ce dernier, je suggère de regarder dans le cadre AddIn dans .NET 3.5.

Étant donné l'un de ces choix, un très bon modèle de conception à utiliser dans ce cas est le Observer pattern. Vos "observateurs" regardent l'événement de clic de bouton (le observé) et exécutent leurs MessageBox (es) de manière appropriée.

Questions connexes