私はかつて、リモーティングを使用するシステムを展開し、サーバーがクライアントがサブスクライブできるいくつかのイベントを開始しました。
これを可能にするには、typeFilterLevel を完全に設定する必要があります。また、イベントを処理できるようにするために、クライアントとサーバーで認識される「中間」オブジェクトも作成する必要があります。
例: これは、サーバーとクライアント側で認識されるクラスです。
public abstract class MyDelegateObject : MarshalByRefObject
{
public void EventHandlerCallback( object sender, EventArgs e )
{
EventHandlerCallbackCore(sender, e);
}
protected abstract void EventHandlerCallbackCore(object sender, EventArgs e );
public override object InitializeLifetimeService() { return null; }
}
クライアント側では、上記のクラスから継承する別のクラスを作成し、イベントが発生したときに実行する必要がある実際のロジックを実装します。
public class MyConcreteHandler : MyDelegateObject
{
protected override EventHandlerCallbackCore(object sender, EventArgs e)
{
// do some stuff
}
}
次のように、イベントハンドラをリモート オブジェクトのイベントにアタッチするだけです。
MyConcreteHandler handler = new MyConcreteHandler();
myRemoteObject.MyEventOccured += new EventHandler(handler.EventHandlerCallback);
もちろん、EventHandler クラスで Winform コントロールを更新する場合は、そのクラスも ISynchronizeInvoke を実装する必要があります。