2012-09-03 4 views
5

Ho un'app vb6 che sta utilizzando un oggetto COM (oggetto COM esposto COM). L'app vb6 è abbonata a un evento pubblicato dall'oggetto COM (C#).Annullare l'iscrizione all'evento dal

Il mio problema è che non so come annullare l'iscrizione a livello di codice da quell'evento. L'unico modo in cui so come annullare la registrazione è non iscrivermi in primo luogo (ad esempio commentando il gestore di eventi nel codice vb6).

C'è un modo per annullare l'iscrizione in fase di esecuzione (a livello di programmazione)? Forse facendo qualcosa sul lato C# identificando il delegato che corrisponde al gestore di eventi vb6 e non chiamandolo?

Grazie in anticipo.

risposta

2

È possibile interrompere la ricezione di eventi in VB6 mantenendo due variabili di riferimento oggetto, una con la parola chiave WithEvents e una senza. Quando vuoi iscriverti, imposta il primo allo stesso oggetto del secondo e, per annullare l'iscrizione, imposta il primo a Nothing. È necessario assicurarsi di rilasciare/sostituire entrambi quando si desidera rilasciare l'oggetto.

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

In alternativa, è sufficiente ricevere l'evento e tornare immediatamente. – Deanna

+0

Questa alternativa (restituire immediatamente) non è praticabile per me perché quello che sto cercando di eliminare sono le transizioni native/gestite che mi stanno causando un sacco di dolore in termini di perfomance. Quindi, a meno di un'altra idea, probabilmente proverò la tua soluzione sopra. Grazie. – mnrtyrpt123

+0

Si potrebbe anche avere una variabile chiamata "SendMeEventX", che si controlla prima di aumentare l'evento. Questo influenzerà tutti gli ascoltatori. – Deanna

2

Un'altra opzione che consente di avere maggiore controllo è un'interfaccia di callback.

Esporre un'interfaccia nella libreria .NET con un solo metodo EventXYZ. La tua classe VB6 (e altri listener) può implementare questa interfaccia e passare un riferimento all'oggetto alla classe .NET su cui innalzare il metodo.

Questo è essenzialmente lo stesso metodo utilizzato dagli eventi COM e .NET internall, ma .NET ha una granularità più bassa fino al livello di evento.