2010-12-03 25 views
1

J'ai écrit un système de plugin qui utilise une interface et pour tous les plugins qui répondent à ce contrat sont chargés à l'exécution dans le système principal.C# Plugin Event Handling

Le plugin renvoie effectivement un TabPage qui est inséré dans l'application principale, et est contrôlé depuis le plugin dll.

Si une erreur se produit dans le plug-in, le message d'erreur Windows standard s'affiche. Qu'est-ce que je veux le faire créer un événement qui renvoie le message d'erreur afin que je puisse l'afficher dans la zone que j'ai réservé pour le texte. Dois-je garder une trace de toutes les instances de plugin/interface attachées pour pouvoir configurer un événement pour surveiller chacune d'elles? À l'heure actuelle, mon système parcourt les dll dans le dossier de l'application et ceux qui rencontrent le contrat d'interface sont chargés, l'instance réelle de l'interface est annulée à chaque fois que le contrôle est transmis à la DLL via les événements de bouton qui sont chargés avec le TabPage et manipulés dans le plugin.

J'espère que tout cela a du sens.

Répondre

3

Vous n'avez pas besoin de garder une référence à la classe plugin, il suffit d'ajouter un délégué à l'événement lorsque vous le démarrez, après quoi vous n'avez plus besoin de la référence.

+0

acclamations excellents. Je ne suis pas familier avec les délégués, je les lirai cet après-midi. Merci. –

3

Vous pouvez ajouter un événement à votre contrat de plugin:

public interface IPlugin 
{ 
    event EventHandler<ErrorEventArgs> Error; 

    void Initialise(); 
} 

De cette façon, tout hôte peut souscrire à cet événement lorsque des erreurs se produisent dans le plug-in:

public class MyPlugin : IPlugin 
{ 
    public event EventHandler<ErrorEventArgs> Error; 

    public void Initialise() 
    { 
     try 
     { 

     } 
     catch (Exception e) 
     { 
      OnError(new ErrorEventArgs(e)); 
     } 
    } 

    protected void OnError(ErrorEventArgs e) 
    { 
     var ev = Error; 
     if (ev != null) 
      ev(this, e); 
    } 
} 
1

Si je vous ai suivi poster correctement, voici comment je vais le faire.

Dans l'interface du plugin (disons IPlugin), vous devrez déclarer un événement.

public delegate void ShowErrorEventHandler(string errorMessage); 
public interface IPlugin 
{ 
    event ShowErrorEventHandler ShowError; 
} 

Ensuite, lorsque vous chargez vos plug-ins, pour chacun d'eux suffit de souscrire à son événement showError, par exemple:

... 
foreach(var plugin in plugins) 
{ 
    plugin.ShowError += MainForm_ShowError; 
} 
... 

private void MainForm_ShowError(string errorMessage) 
{ 
    // Do something with the error... stick it in your reserved area 
    txtReservedArea.Text = errorMessage; 
} 

Hope this helps