2012-09-03 15 views
5

Mam aplikację vb6, która korzysta z obiektu COM (obiekt C# z ekspozycją COM). Aplikacja vb6 subskrybuje wydarzenie publikowane przez obiekt COM (C#).Programowo anuluj subskrypcję zdarzenia

Moim problemem jest to, że nie wiem, jak programowo zrezygnować z subskrypcji tego wydarzenia. Jedyny sposób, w jaki umiem się wypisać, to nie subskrybowanie w pierwszej kolejności (tj. Komentowanie programu obsługi zdarzeń w kodzie VB6).

Czy jest sposób na anulowanie subskrypcji w czasie wykonywania (programowo)? Może robiąc coś po stronie C#, identyfikując delegata, który odpowiada obsłudze zdarzenia vb6 i nie wywołując go?

Z góry dziękuję.

Odpowiedz

2

Możesz zatrzymać odbieranie zdarzeń w VB6, zachowując dwie zmienne referencyjne obiektu, jedną ze słowem kluczowym WithEvents i jedną bez. Aby subskrybować, ustaw najpierw ten sam obiekt co drugi, a aby anulować subskrypcję, ustaw pierwszy jako Nothing. Musisz zwolnić/zastąpić oba, gdy chcesz zwolnić obiekt.

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

Alternatywnie, po prostu odbierz wydarzenie i natychmiast wróć. – Deanna

+0

Ta alternatywa (powrót natychmiast) nie jest dla mnie opłacalna, ponieważ próbuję się pozbyć z natywnych/zarządzanych przejść, które powodują wiele żalu w perfekcji. Tak bliski innej idei, prawdopodobnie wypróbuję twoje rozwiązanie powyżej. Dzięki. – mnrtyrpt123

+0

Możesz także mieć zmienną o nazwie "SendMeEventX", którą sprawdzasz przed podniesieniem zdarzenia. To jednak wpłynie na wszystkich słuchaczy. – Deanna

2

Inną opcją pozwalającą uzyskać większą kontrolę jest interfejs wywołania zwrotnego.

Wystawiasz interfejs w swojej bibliotece .NET, który ma jedną metodę: EventXYZ. Twoja klasa VB6 (i inne programy nasłuchujące) mogą zaimplementować ten interfejs i przekazać odwołanie do obiektu do klasy .NET, aby podnieść tę metodę.

Jest to zasadniczo ta sama metoda, w której zdarzenia COM i .NET używają internall, ale .NET ma większą szczegółowość do poziomu zdarzenia.