Compartir a través de


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

  1. 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.

  2. Aplique ComSourceInterfacesAttribute para conectar la interfaz de receptor de eventos con la clase administrada.

  3. 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.

  4. Implemente la interfaz de receptor de eventos en COM.

  5. 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

Referencia

ComSourceInterfacesAttribute

Otros recursos

Eventos administrados y no administrados