2010-12-03 26 views
1

Ich habe ein Plugin-System geschrieben, das eine Schnittstelle verwendet und für alle Plugins, die diesen Vertrag erfüllen, zur Laufzeit in das Hauptsystem geladen werden.C# Plugin Ereignisbehandlung

Das Plugin gibt eine TabPage zurück, die in die Hauptanwendung eingefügt wird und von innerhalb der Plugin-DLL gesteuert wird.

Wenn ein Fehler innerhalb des Plugins auftritt, wird die Standard-Windows-Fehlermeldung angezeigt. Was ich tun möchte, erstellen Sie ein Ereignis, das die Fehlermeldung zurückgibt, damit ich es in dem Bereich anzeigen kann, den ich für Text reserviert habe.

Muss ich alle angehängten Plug-in/Interface-Instanzen verfolgen, um ein Ereignis für die Überwachung einzurichten?

Derzeit durchläuft mein System die DLLs innerhalb des App-Ordners und diejenigen, die den Schnittstellenvertrag erfüllen, werden geladen, die eigentliche Instanz der Schnittstelle wird jedes Mal verworfen, wenn die Kontrolle über Button-Ereignisse an die DLL übergeben wird die mit der TabPage geladen und innerhalb des Plugins bearbeitet werden.

Ich hoffe, das alles macht Sinn.

Antwort

3

Sie müssen keinen Verweis auf die Plug-in-Klasse beibehalten, fügen Sie einfach einen Delegaten zum Ereignis hinzu, wenn Sie ihn starten, danach brauchen Sie den Verweis nicht mehr.

+0

Excellent prost. Ich kenne Delegierte nicht so gut, werde sie heute nachmittag lesen. Vielen Dank. –

3

Sie einen Termin in Ihrem Plugin Vertrag könnte hinzufügen:

public interface IPlugin 
{ 
    event EventHandler<ErrorEventArgs> Error; 

    void Initialise(); 
} 

Auf diese Weise kann jeder Host zu diesem Ereignis abonnieren, wenn Fehler im Plugin auftreten:

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

Wenn ich Ihnen gefolgt richtig schreiben, so würde ich es machen.

In der Plugin-Schnittstelle (sagen wir IPlugin) müssen Sie ein Ereignis deklarieren.

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

Dann, wenn Sie Ihre Plugins laden, für jeden abonnieren Sie es Error-Ereignis ist, zum Beispiel:

... 
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; 
} 

hoffe, das hilft