Gewusst wie: Auslösen von Ereignissen, die von einem COM-Empfänger behandelt werden

Aktualisiert: November 2007

Wenn Sie nicht mit dem von .NET Framework bereitgestellten Delegate-basierten Ereignismodell vertraut sind, finden Sie weitere Informationen unter Behandeln und Auslösen von Ereignissen. Den vorliegenden Abschnitt betreffende Details finden Sie ebenfalls dort unter Auslösen eines Ereignisses.

.NET Framework stellt ein Delegat-basiertes Ereignissystem bereit, um eine Verbindung zwischen einem Ereignissender (Quelle) und einem Ereignisempfänger (Senke) herzustellen. Ist die Senke ein COM-Client, muss die Quelle zusätzliche Elemente zur Simulation von Verbindungspunkten enthalten. Mithilfe dieser Änderungen kann ein COM-Client seine Ereignissenken-Schnittstelle auf herkömmliche Weise durch Aufruf der IConnectionPoint::Advise-Methode registrieren. (Visual Basic blendet Details bezüglich der Verbindungspunkte aus, sodass Sie diese Methoden nicht direkt aufzurufen brauchen.)

So interoperieren Sie mit einer COM-Ereignissenke

  1. Definieren Sie die Ereignissenken-Schnittstelle in verwaltetem Code. Diese Schnittstelle kann eine Teilmenge der Ereignisse enthalten, die aus einer verwalteten Klasse stammen. Die Methodennamen der Schnittstelle müssen mit den Ereignisnamen übereinstimmen.

  2. Wenden Sie ComSourceInterfacesAttribute an, um die Ereignissenken-Schnittstelle mit der verwalteten Klasse zu verbinden.

  3. Exportieren Sie die Assembly, welche die Klasse enthält, in die Typbibliothek. Verwenden Sie Type Library Exporter-Tool (Tlbexp.exe) oder eine äquivalente API, um die Assembly zu exportieren.

  4. Implementieren Sie die Ereignissenken-Schnittstelle in COM.

  5. Für COM-Clients, die Ereignisse empfangen, implementieren Sie die durch die Ereignisquelle in der entsprechenden Typbibliothek definierte Ereignissenken-Schnittstelle. Verwenden Sie dann den Verbindungspunktmechanismus, um die Senkenschnittstelle mit der Ereignisquelle zu verbinden.

Beispiel

Das folgende Beispiel enthält einen verwalteten Server als Ereignisquelle und einen COM-Client als Ereignissenke. Der verwaltete Server deklariert ButtonEvents als Ereignissenken-Schnittstelle und verbindet die Schnittstelle mit der Button-Klasse. Der nicht verwaltete Client erstellt eine Instanz der Button-Klasse und implementiert die Ereignissenken-Schnittstelle.

' 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

Siehe auch

Aufgaben

Gewusst wie: Behandeln von Ereignissen, die durch eine COM-Quelle ausgelöst wurden

Konzepte

Verfügbarmachen von .NET Framework-Komponenten in COM

Referenz

ComSourceInterfacesAttribute

Weitere Ressourcen

Verwaltete und nicht verwaltete Ereignisse