2011-08-16 11 views
5

Necesito ser capaz de manejar un evento .net en VB6. Hasta ahora lo tengo configurado al hacerme C# class COM visible. Mi objeto VB6 puede llamar a los métodos, pero ahora necesito una forma de comunicarme desde .net a VB. Si agrego un evento a mi clase C#, el contenedor .net parece agregar un add_EventName y remove_EventName, que supongo que es para suscribirse y cancelar la suscripción al evento. Pero todavía soy un novato en lo que respecta a VB6 y vengo, así que no estoy seguro de cómo usarlo.Suscríbete al evento C# .net en VB6

El add_EventName parece tomar un EventNameEventHadler, pero ¿qué le doy? Probé el sub pero esto me da un error de tiempo de ejecución. Alguien sabe cómo usar esto? Aquí está un ejemplo de lo que tengo

Private oHost As HostService.IHost 

Private Sub Form_Load() 
    Set oHost = New HostService.Host 
    oHost.Start 
    oHost.add_EvalReceived EvalReceivedEventHandler 
End Sub 

Private Sub EvalReceivedEventHandler(ByVal sender As Variant, ByVal e As EvalReceivedEventArgs) 
MsgBox "Eval Received in VB: " & e.Eval.TimeSent & ":" & e.Eval.FirstName & " " & e.Eval.LastName & " - " & e.Eval.Comments 
End Sub 

línea Así oHost.add_EvalReceived está mal

+0

ah y el oHost es mi COM visibles objeto .NET –

Respuesta

4

Usted podría intentar añadiendo WithEvents a su declaración de oHost

Private WithEvents oHost As HostService.IHost 

Luego, el IDE debería permitirle crear manejadores de eventos en oHost. Es como crear su controlador de eventos . El menú desplegable en la esquina superior izquierda de la ventana de código debería permitirle seleccionar oHost.

Descargo de responsabilidad: He utilizado esto muchas veces para manejar eventos de objetos COM. Nunca he intentado manejar eventos de un objeto .Net a través de interoperabilidad, pero creo que debes hacerlo así.

+0

¿Hay alguna otra cosa que hay que hacer para el objeto .NET? Aparece el mensaje "El objeto no genera eventos de automatización" cuando intento compilar –

+0

@ Nitro52 No lo sé, lo siento :(Nunca he usado esto con un objeto de interoperabilidad. Podrían ver [esta respuesta] (http://stackoverflow.com/questions/2766656/handling-events-exposed-on-a-net-class-via-com-in-vb6/2772558#2772558)? – MarkJ

1

En VB6 se puede utilizar el operador AddressOf para crear el delegado implícitamente:

oHost.add_EvalReceived AddressOf EvalReceivedEventHandler 
4

Ok, lo tengo trabajando con la ayuda de MarkJ. Tenía que tener una interfaz que representara mis eventos para COM. Así terminaron con este aspecto

[ComSourceInterfaces(typeof(IHostEvents))] 
[ClassInterface(ClassInterfaceType.None)] 
[Guid("037CF765-4C30-4CF7-969C-1775E79844CE")] 
public class Host : IHost 
{ 
    //IHost implementation 
} 

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
[Guid("8C0C3F0E-5793-4E11-AB20-3A556C0B6790")] 
public interface IHostEvents 
{ 
    [DispId(1)] 
    void EvalReceived(object sender, EvalReceivedEventArgs e); 
} 
Cuestiones relacionadas