2012-09-03 19 views
5

私はCOMオブジェクト(COM公開C#オブジェクト)を使用しているvb6アプリケーションを持っています。 vb6アプリケーションは、COM(C#)オブジェクトによってパブリッシュされたイベントを購読しています。イベントからのプログラムによる登録解除

私の問題は、プログラムからのイベントからの退会の仕方がわかりません。私がunsuscribeする方法を知っている唯一の方法は、最初に購読しないことです(つまり、vb6コードのイベントハンドラをコメントアウトする)。

実行時に(プログラムで)サブスクライブを解除する方法はありますか?多分、C#側でvb6イベントハンドラに対応するデリゲートを特定し、それを呼び出さないで何かを行うことによって?

ありがとうございます。

答えて

2

VB6でのイベントの受信を停止するには、2つのオブジェクト参照変数(1つはWithEventsキーワードなし)を使用します。購読する場合は、最初のものを2番目のものと同じオブジェクトに設定し、購読を停止するには、最初にNothingに設定します。オブジェクトを解放するときは、両方を解放/置換する必要があります。

Dim MyObject As MyClass 
Dim WithEvents MyObjectEvents As MyClass 

Public Sub MyObjectEvents_EventName() 
    MsgBox "Received event" 
End Sub 

Private Sub Subscribe() 
    Set MyObjectEvents = MyObject 
End Sub 

Private Sub Unsubscribe() 
    Set MyObjectEvents = Nothing 
End Sub 
+0

また、イベントを受信して​​すぐに戻ることもできます。 – Deanna

+0

私が取り除こうとしているのは、ネイティブ/管理されたトランジションで、私には多くの悲しみを引き起こしているので、この代替案(私はただちに復帰)は実用的ではありません。だから私はおそらく上のあなたのソリューションを試してみましょう別のアイデアの短い。ありがとう。 – mnrtyrpt123

+0

また、イベントを発生させる前にチェックする変数 "SendMeEventX"を持つこともできます。これはすべてのリスナーに影響します。 – Deanna

2

さらに制御できるオプションとして、コールバックインターフェイスがあります。

EventXYZメソッドを1つ持つインターフェイスを.NETライブラリに公開します。 VB6クラス(および他のリスナー)は、このインターフェイスを実装して、そのメソッドを呼び出すためのオブジェクトへの参照を.NETクラスに渡すことができます。

これは、COMと.NETイベントがinternallを使用するのと本質的に同じメソッドですが、.NETはイベントレベルより細分化されています。

関連する問題