Практическое руководство. Вызов событий, обрабатываемых приемником COM
Сведения о модели событий на основе делегатов, предоставляемой платформой .NET Framework, см. в разделе Обработка и вызов событий. Конкретные сведения, применимые к этой теме, см. в пункте Вызов события этого же раздела.
В .NET Framework для связи отправителя события (источника) с получателем события (приемником) используется система событий на основе делегатов. Если приемник является COM-клиентом, источник должен включать дополнительные элементы для имитации точек подключения. С этими изменениями COM-клиент может зарегистрировать свой интерфейс приемника событий традиционным способом, вызвав метод IConnectionPoint::Advise. (Visual Basic скрывает данные точек подключения, поэтому непосредственный вызов этих методов не требуется.)
Взаимодействие с приемником событий COM
Определите интерфейс приемника событий в управляемом коде. Интерфейс может содержать подмножество событий, порождаемых управляемым классом. Имена методов интерфейса могут совпадать с именами событий.
Примените атрибут ComSourceInterfacesAttribute для подключения интерфейса приемника событий к управляемому классу.
Экспортируйте сборку, содержащую класс, в библиотеку типов. Для экспорта сборки используйте Tlbexp.exe (программа экспорта библиотек типов) или эквивалентную функцию API.
Реализуйте интерфейс приемника событий в COM.
Для COM- клиентов, принимающих события, реализуйте интерфейс приемника событий, определенный источником событий в соответствующей библиотеке типов. Затем используйте механизм точек подключения для связывания интерфейса приемника с источником событий.
Пример
В следующем примере показан управляемый сервер в качестве источника событий и COM-клиент в качестве приемника событий. Управляемый сервер объявляет интерфейс приемника событий ButtonEvents и связывает этот интерфейс с классом Button. Неуправляемый клиент создает экземпляр класса Button и реализует интерфейс приемника событий.
' 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
См. также
Задачи
Практическое руководство. Обработка событий, вызванных COM-источником
Ссылки
Основные понятия
Предоставление COM-клиентам доступа к компонентам .NET Framework