Partilhar via


Como: Elevar eventos tratados por um coletor COM

Se você não está familiarizado com o delegado evento modelo fornecido pelo .NET estrutura, 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.

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

Para interoperar com um COM evento dissipador

  1. Definir o evento interface sink no código gerenciado.Esta interface pode conter um subconjunto de eventos originados por uma gerenciado classe.sistema autônomo nomes de método de interface devem ser o mesmo que sistema autônomo nomes de evento.

  2. Aplicar o ComSourceInterfacesAttribute para conectar o evento dissipador interface para a classe gerenciada.

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

  4. Implementar o evento interface sink no COM.

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

Exemplo

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

Conceitos

Expondo componentes .NET estrutura para com.

Referência

ComSourceInterfacesAttribute

Outros recursos

Eventos gerenciados e não gerenciados