Cómo: Generar eventos controlados por un receptor COM
Actualización: noviembre 2007
Si no está familiarizado con el modelo de eventos basado en delegados que proporciona .NET Framework, vea Controlar y provocar eventos. Para obtener información específica relacionada con este tema, vea Provocar un evento en la misma sección.
.NET Framework proporciona un sistema de eventos basado en delegados para conectar un remitente de eventos (origen) con un receptor de eventos (receptor). Si el receptor es un cliente COM, el origen debe incluir elementos adicionales para simular los puntos de conexión. Con estas modificaciones, un cliente COM puede registrar su interfaz de receptor de eventos de la forma tradicional llamando al método IConnectionPoint::Advise. Visual Basic oculta la información de los puntos de conexión, por lo que no es necesario llamar a estos métodos directamente.
Para interoperar con un receptor de eventos COM
Defina la interfaz de receptor de eventos en código administrado. Esta interfaz puede contener un subconjunto de los eventos cuyo origen es una clase administrada. Los nombres de método de la interfaz deben ser iguales que los nombres de evento.
Aplique ComSourceInterfacesAttribute para conectar la interfaz de receptor de eventos con la clase administrada.
Exporte el ensamblado que contiene la clase a una biblioteca de tipos. Use Exportador de la biblioteca de tipos (Tlbexp.exe) o una API equivalente para exportar el ensamblado.
Implemente la interfaz de receptor de eventos en COM.
Para los clientes COM que reciben eventos, implemente la interfaz de receptor de eventos definida por el origen de eventos en la biblioteca de tipos. Después utilice el mecanismo de puntos de conexión para conectar la interfaz de receptor al origen de eventos.
Ejemplo
En el siguiente ejemplo se muestra un servidor administrado como el origen del evento y un cliente COM como receptor de eventos. El servidor administrado declara ButtonEvents como interfaz de receptor de eventos y la conecta con la clase Button. El cliente no administrado crea una instancia de la clase Button e implementa la interfaz de receptor de eventos.
' Managed server (event source)
Option Explicit
Option Strict
Imports System
Imports System.Runtime.InteropServices
Namespace EventSource
Public Delegate Sub ClickDelegate(x As Integer, y As Integer)
Public Delegate Sub ResizeDelegate()
Public Delegate Sub PulseDelegate()
' Step 1: Defines an event sink interface (ButtonEvents) to be
' implemented by the COM sink.
<GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967"), _
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface ButtonEvents
Sub Click(x As Integer, y As Integer)
Sub Resize()
Sub Pulse()
End Interface
' Step 2: Connects the event sink interface to a class
' by passing the namespace and event sink interface
' ("EventSource.ButtonEvents, EventSrc").
<ComSourceInterfaces(GetType(ButtonEvents))> _
Public Class Button
Public Event Click As ClickDelegate
Public Event Resize As ResizeDelegate
Public Event Pulse As PulseDelegate
Public Sub CauseClickEvent(x As Integer, y As Integer)
RaiseEvent Click(x, y)
End Sub
Public Sub CauseResizeEvent()
RaiseEvent Resize()
End Sub
Public Sub CausePulse()
RaiseEvent Pulse()
End Sub
End Class
End Namespace
using System;
using System.Runtime.InteropServices;
namespace EventSource
{
public delegate void ClickDelegate(int x, int y);
public delegate void ResizeDelegate();
public delegate void PulseDelegate();
// Step 1: Defines an event sink interface (ButtonEvents) to be
// implemented by the COM sink.
[GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface ButtonEvents
{
void Click(int x, int y);
void Resize();
void Pulse();
}
// Step 2: Connects the event sink interface to a class
// by passing the namespace and event sink interface
// ("EventSource.ButtonEvents, EventSrc").
[ComSourceInterfaces(typeof(ButtonEvents))]
public class Button
{
public event ClickDelegate Click;
public event ResizeDelegate Resize;
public event PulseDelegate Pulse;
public Button()
{
}
public void CauseClickEvent(int x, int y)
{
Click(x, y);
}
public void CauseResizeEvent()
{
Resize();
}
public void CausePulse()
{
Pulse();
}
}
}
' COM client (event sink)
' This Visual Basic 6.0 client creates an instance of the Button class and
' implements the event sink interface. The WithEvents directive
' registers the sink interface pointer with the source.
Public WithEvents myButton As Button
Private Sub Class_Initialize()
Dim o As Object
Set o = New Button
Set myButton = o
End Sub
' Events and methods are matched by name and signature.
Private Sub myButton_Click(ByVal x As Long, ByVal y As Long)
MsgBox "Click event"
End Sub
Private Sub myButton_Resize()
MsgBox "Resize event"
End Sub
Private Sub myButton_Pulse()
End Sub
Vea también
Tareas
Cómo: Controlar eventos provocados por un origen COM
Conceptos
Exponer componentes de .NET Framework en COM