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
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.
Aplicar o ComSourceInterfacesAttribute para conectar o evento dissipador interface para a classe gerenciada.
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.
Implementar o evento interface sink no COM.
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.