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
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.
Aplicar o ComSourceInterfacesAttribute para conectar-se a interface do coletor de eventos para a classe de gerenciados.
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.
Implementar a interface de coletor de eventos em COM.
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
Conceitos
Expondo.NET Framework para COM