Partilhar via


Como: Gerar eventos manipulados por um coletor COM

Se você não estiver familiarizado com o modelo de evento com o delegado fornecido pelo.NET Framework, consulte Tratamento e disparada de eventos. Para obter detalhes específicos que se aplicam a este tópico, consulte Gerando um evento na mesma seção.

A.NET Framework fornece um sistema de eventos com base no delegado para se conectar a um remetente de evento (origem) para um receptor de evento (coletor). Quando o coletor é um cliente COM, a fonte deve incluir elementos adicionais para simular os pontos de conexão. Com essas modificações, um cliente COM pode registrar sua interface de coletor de eventos da forma tradicional, chamando o IConnectionPoint:: Advise método. (Visual Basic oculta detalhes do ponto de conexão, portanto, você não tem que chamar esses métodos diretamente.)

Para interoperar com um coletor de eventos COM

  1. Defina a interface do coletor de eventos no código gerenciado. Esta interface pode conter um subconjunto dos eventos originados por uma classe gerenciada. Os nomes de método da interface devem ser o mesmo que os nomes de evento.

  2. Aplicar o ComSourceInterfacesAttribute para conectar-se a interface do coletor de eventos para a classe de gerenciados.

  3. Exporte o assembly que contém a classe para uma biblioteca de tipos. Use o Tlbexp. exe (exportador da biblioteca) ou uma API equivalente para exportar o assembly.

  4. Implementar a interface de coletor de eventos em COM.

  5. Para clientes COM que o coletor de eventos, implemente a interface do coletor de eventos definida pela origem do evento na sua biblioteca de tipos. Em seguida, use o mecanismo de ponto de conexão para conectar-se a interface do coletor para a origem do evento.

Exemplo

O exemplo a seguir mostra um servidor gerenciado como origem do evento e um cliente COM como o coletor de eventos. O servidor gerenciado declara ButtonEvents como um evento sink de interface e se conecta a interface para o Button classe. O cliente não gerenciado cria uma instância da Button de classe e implementa a interface de coletor 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

Consulte também

Tarefas

Como: Manipular eventos gerados por uma fonte COM

Referência

ComSourceInterfacesAttribute

Conceitos

Expondo.NET Framework para COM

Outros recursos

Eventos gerenciados e não gerenciados