Comment : déclencher des événements gérés par un récepteur COM

Mise à jour : novembre 2007

Si vous n'êtes pas très familiarisé avec le modèle d'événement reposant sur les délégués fourni par le .NET Framework, consultez Gestion et déclenchement d'événements. Pour des détails spécifiques concernant cette rubrique, consultez Déclenchement d'un événement dans la même section.

Le .NET Framework fournit un système d'événements reposant sur les délégués pour connecter un expéditeur d'événements (source) à un récepteur d'événements (récepteur). Quand le récepteur est un client COM, la source doit inclure des éléments supplémentaires pour simuler des points de connexion. Avec ces modifications, un client COM peut inscrire l'interface de son récepteur d'événements de manière standard en appelant la méthode IConnectionPoint::Advise. (Visual Basic masque les détails des points de connexion ; vous n'avez donc pas à appeler ces méthodes directement.)

Pour réaliser une interopérabilité avec un récepteur d'événements COM

  1. Définissez l'interface du récepteur d'événements dans le code managé. Cette interface peut contenir un sous-ensemble des événements émis par une classe managée. Les noms des méthodes de l'interface doivent être identiques aux noms des événements.

  2. Appliquez l'attribut ComSourceInterfacesAttribute pour connecter l'interface du récepteur d'événements à la classe managée.

  3. Exportez l'assembly contenant la classe vers une bibliothèque de types. Utilisez Type Library Exporter, outil (Tlbexp.exe) ou une API équivalente pour exporter l'assembly.

  4. Implémentez l'interface du récepteur d'événements dans COM.

  5. Pour les clients COM qui réceptionnent des événements, implémentez l'interface du récepteur d'événements définie par la source de l'événement dans sa bibliothèque de types. Utilisez ensuite le mécanisme de point de connexion pour connecter l'interface du récepteur à la source de l'événement.

Exemple

L'exemple suivant présente un serveur managé comme source d'événements et un client COM comme récepteur d'événements. Le serveur managé déclare ButtonEvents en tant qu'interface du récepteur d'événements et connecte l'interface à la classe Button. Le client non managé crée une instance de la classe Button et implémente l'interface du récepteur d'événements.

' 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

Voir aussi

Tâches

Comment : gérer les événements déclenchés par une source COM

Concepts

Exposition de composants .NET Framework à COM

Référence

ComSourceInterfacesAttribute

Autres ressources

Événements managés et non managés