2012-09-03 10 views
5

Tengo una aplicación vb6 que está utilizando un objeto COM (objeto C# expuesto). La aplicación vb6 se está suscribiendo a un evento publicado por el objeto COM (C#).Anular la suscripción programáticamente al evento

Mi problema es que no sé cómo cancelar la suscripción programáticamente a ese evento. La única forma en que sé cómo inscribirme es no suscribirme en primer lugar (es decir, comentar el controlador de eventos en el código vb6).

¿Hay alguna forma de cancelar la suscripción en el tiempo de ejecución (mediante programación)? ¿Tal vez haciendo algo en el lado C# identificando el delegado que corresponde al controlador de eventos vb6 y no llamándolo?

Gracias de antemano.

Respuesta

2

Puede dejar de recibir eventos en VB6 manteniendo dos variables de referencia de objeto, una con la palabra clave WithEvents y otra sin ella. Cuando desee suscribirse, configure el primero en el mismo objeto que el segundo y, para cancelar la suscripción, configure el primero en Nothing. Debe asegurarse de liberar/reemplazar ambos cuando desee liberar el objeto.

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

Como alternativa, simplemente reciba el evento y regrese inmediatamente. – Deanna

+0

Esta alternativa (regreso de inmediato) no es viable para mí, porque lo que estoy tratando de eliminar son las transiciones nativas/gestionadas que me están causando mucha pena en cuanto al rendimiento. Tan corto de otra idea Probablemente probaré tu solución arriba. Gracias. – mnrtyrpt123

+0

También podría tener una variable llamada "SendMeEventX", que debe consultar antes de iniciar el evento. Sin embargo, esto afectará a todos los oyentes. – Deanna

2

Otra opción que le permite tener más control es una interfaz de devolución de llamada.

Expone una interfaz en su biblioteca .NET que tiene un único método EventXYZ. Su clase VB6 (y otros oyentes) pueden implementar esta interfaz y pasar una referencia al objeto a su clase .NET para que se active el método.

Este es esencialmente el mismo método que los eventos COM y .NET usan internamente, pero .NET tiene más granularidad hasta el nivel del evento.

Cuestiones relacionadas