4

.NET クラスを COM に公開したいと考えています。それはかなり簡単です:

  • ComVisible にする必要があるそのクラスのメンバーを定義するインターフェイスを作成します。
  • これらのメンバーの DispId を自分で定義します
  • インターフェイスはComVisible
  • Guidそのインターフェイスに を割り当てます
  • そのインターフェースを実装するクラスを作成します

大きな問題ではない。これはすべて機能します。しかし、私の質問は次のとおりです。そのクラスには、COM にも公開したいイベントがいくつかあります。
これも大したことではありませんが、いくつかの例 (MS の ComInterop ツールによって生成された fi コード) を見ると、イベントが別のインターフェイスで宣言されていることがわかります。つまり、あるべきクラスはComVisible、2 つのインターフェースを実装します。

  • 必要な通常のメソッドとプロパティを定義する 1 つのインターフェイスComVisible
  • であるべきイベントを定義する別のインターフェースComVisible

さて、私の質問は次のとおりです。なぜですか?この理由は何ですか?

イベントが別のインターフェイスで定義されているのはなぜですか?また、ComVisibleイベントが定義されるべきメソッドとプロパティを含むインターフェイスで定義されていないのはなぜComVisibleですか?

この背後にある理由は何ですか?

4

2 に答える 2

5

これは、COM イベントの仕組みによるものです。COM はデリゲートとは何かを認識していないため、そのイベントはコールバック インターフェイスを使用して実装されます。イベントを受信したいオブジェクトはイベント インターフェイスを実装し、それを送信者 (コード) に渡し、送信者はそのメソッドを呼び出します。したがって、イベントに関心のある人が残りのインターフェースを実装する必要がないようにするため、イベント インターフェースは分離されています。

舞台裏では、イベント インターフェイスは「接続ポイント」を使用して管理されます。これにより、受信者はコールバック インターフェイスを送信者に接続できます。この実装には、一連の COM インターフェイス (IConnectionPoint、IConnectionPointContainer、IEnumConnectionPoints、IEnumConnections) と面倒なハウスキーピングが必要です。COM イベントをネイティブ C++ などで実装している場合は、これらのインターフェイスに注意する必要があります。幸いなことに、.NET プログラマーはそれらを実装する必要はありません。.NET が実装してくれるからです。

于 2009-12-31T14:39:08.607 に答える
1

イベントは常に別のインターフェイスで定義されています。これは、.NET によって実装された COM インターフェイスに固有のものではなく、すべての COM インターフェイスに固有のものです。私の見方では、インターフェイスはメソッドとプロパティのコレクションを表しますが、イベント インターフェイスのメソッドはそれらのいずれのようにも呼び出されません。クライアントではなくサーバーによって呼び出されるため、通常のメソッドの動作とは一致しません。したがって、これらのメソッドを別のインターフェイスに実装することで、サーバーが呼び出すことができる関数を、クライアントが呼び出すことができるメソッドから分離できます。クライアントはイベント メソッドを呼び出すことができません。サーバーが呼び出すことができるオブジェクトにインターフェースを実装する必要があります。同様に、クライアントは、サーバーに既に実装されているインターフェイスを実装するべきではありません。サーバーに実装されているこれらのインターフェースの既存の実装を呼び出す必要があります。これを処理する最も簡単な方法は、クライアントがイベント処理のために実装するために 1 つのインターフェースを提供し、クライアントが既に実装されている関数を呼び出すことができる別のインターフェースをサーバーによって実装することです。

于 2009-12-31T14:33:07.673 に答える