2010-12-03 12 views
1

インタフェースを使用するプラグインシステムを作成しました。この契約を満たすプラグインは、実行時にメインシステムにロードされます。c#プラグインイベント処理

プラグインは、メインアプリケーションに挿入されたタブページを効果的に返し、プラグインDLLから制御されます。

プラグイン内でエラーが発生すると、標準のWindowsエラーメッセージが表示されます。私がそれをやりたいのは、エラーメッセージを返すイベントを作成して、テキスト用に予約した領域に表示することができます。

接続されているすべてのプラグイン/インターフェイスインスタンスを監視して、それぞれを監視するイベントを設定する必要がありますか?

現在、私のシステムはアプリケーションフォルダ内のdllをループし、インターフェイス契約を満たすDLLはロードされ、ボタンイベントを介してコントロールがDLLに渡されるたびに、インターフェイスの実際のインスタンスは破棄されますTabPageでロードされ、プラグイン内で処理されます。

これはすべて意味があると思います。

答えて

3

プラグインクラスへの参照を保持する必要はありません。プラグインクラスを起動するときに代理人を追加するだけで、後で参照を必要としないようにすることができます。あなたのプラグインの契約にイベントを追加することができ

+0

優秀な歓声に役立ちます。私はデリゲートに精通していないので、今日の午後に読んでみましょう。ありがとう。 –

3

public interface IPlugin 
{ 
    event EventHandler<ErrorEventArgs> Error; 

    void Initialise(); 
} 

そのようにエラーがプラグイン内で発生したときに、任意のホストは、そのイベントをサブスクライブすることができます

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

を私はあなたに従っている場合これは私がそれをやり遂げる方法です。

プラグインインタフェース(IPluginと言います)では、イベントを宣言する必要があります。

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

あなたのプラグインをロードし、それぞれがそれに加入するためには、例えば、ShowErrorイベントです:

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

希望これは