Partager via


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

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.

Un client .NET (récepteur d'événements) peut recevoir les événements déclenchés par un serveur COM existant (source d'événements). COM Interop génère les délégués nécessaires dans les métadonnées que vous incluez dans votre client managé. Une signature de délégué importée comprend l'interface d'événement du récepteur, un trait de soulignement, le nom de l'événement et le mot EventHandler : InterfaceÉvénementRécepteur_NomÉvénementEventHandler.

Notez que les objets COM déclencheurs d'événements dans un client .NET requièrent deux collections Garbage Collector (GC) avant leur libération. Cela s'explique par le cycle de référence qui se déroule entre les objets COM et les clients managés. Si vous devez libérer explicitement un objet COM, appelez deux fois la méthode Collect.

Pour réaliser une interopérabilité avec une source d'événement COM existante

  1. Récupérez l'assembly PIA (Primary Interop Assembly) pour le serveur COM si les types COM doivent être partagés par d'autres applications. Un assembly PIA (Primary Interop Assembly) contient les métadonnées représentant la bibliothèque de types convertie et est signé par l'éditeur.

    Notes

    Si l'assembly PIA (Primary Interop Assembly) n'est pas disponible ou si l'assembly est destiné à un usage privé, vous pouvez importer la bibliothèque de types en faisant appel à l'outil Type Library Importer (Tlbimp.exe) ou à une API équivalente.

    Le processus de conversion génère un délégué pour chaque événement ; cependant, vous n'êtes obligé de recevoir que les événements qui vous intéressent.

  2. Vous pouvez utiliser un navigateur de métadonnées, tel que MSIL Disassembler (Ildasm.exe), pour identifier des délégués d'événements.

  3. Consommez les événements issus de la source d'événements COM de la même façon que vous consommez les événements provenant d'une source d'événements managés.

Exemple

L'exemple suivant montre comment ouvrir une fenêtre Internet Explorer et connecter les événements déclenchés par l'objet InternetExplorer aux gestionnaires d'événements implémentés dans le code managé. Les définitions de types Internet Explorer (y compris les délégués d'événement) sont importées comme des métadonnées à partir du fichier SHDocVw.dll. L'exemple reçoit l'événement TitleChange.

Option Explicit
Option Strict

Imports System
Imports System.Runtime.InteropServices
Imports SHDocVw

Namespace InternetExplorer
    Public Class Explorer
        Public Shared Sub Main()
            Dim explorer As New Explorer()
            explorer.Run()
        End Sub
      
        Public Sub Run()
            Dim o As Object = Nothing
            Dim s As String
         
            Try
                ' Starts the browser.
                m_IExplorer = New SHDocVw.InternetExplorer()
            Catch e As Exception
                Console.WriteLine("Exception when creating Internet 
                Explorer object {0}", e)
                Return
            End Try
         
            ' Wires your event handlers to m_IExplorer.
            SetAllEvents()
         
            Try
                ' Goes to the home page.
                m_WebBrowser = CType(m_IExplorer, IWebBrowserApp)
                m_WebBrowser.Visible = True
                m_WebBrowser.GoHome()
            
                ' Starts navigating to different URLs.
                Console.Write("Enter URL (or enter to quit): ")
                s = Console.ReadLine()
                While s <> "" And Not (m_IExplorer Is Nothing) _
                And Not (m_WebBrowser Is Nothing)
                    m_WebBrowser.Navigate(s, o, o, o, o)
                    Console.Write("Enter URL (or enter to quit): ")
                    s = Console.ReadLine()
                End While
                m_WebBrowser.Quit()
            Catch sE As Exception
                If m_IExplorer Is Nothing And m_WebBrowser Is Nothing Then
                    Console.WriteLine("Internet Explorer has gone away")
                Else
                    Console.WriteLine("Exception happens {0}", sE)
                End If
            End Try
        End Sub
      
        ' Uses the AddHandler for adding delegates to events.
        Sub SetAllEvents()
            If Not (m_IExplorer Is Nothing) Then
                ' Title Change event
                ' DWebBrowserEvents2 is the name of the sink event interface.
                ' TitleChange is the name of the event.
                ' DWebBrowserEvents2_TitleChangeEventHandler is the delegate 
                ' name assigned by TlbImp.exe.
                Dim DTitleChangeE As New _
DWebBrowserEvents2_TitleChangeEventHandler(AddressOf OnTitleChange)
                AddHandler m_IExplorer.TitleChange, DTitleChangeE
            End If
        End Sub
      
        '----------------------------------------------------------------
        ' Defines event handlers.
        ' Document title changed
        Shared Sub OnTitleChange(sText As String)
            Console.WriteLine("Title changes to {0}", sText)
        End Sub
      
      
        End Sub
        '----------------------------------------------------------------
        ' The following are class fields.
        Private Shared m_IExplorer As SHDocVw.InternetExplorer = Nothing
        Private Shared m_WebBrowser As IWebBrowserApp = Nothing
    End Class
End Namespace
namespace InternetExplorer
{
    using System;
    using System.Runtime.InteropServices;
    using SHDocVw;

    public class Explorer 
    {
        public static void Main()
        {
            Explorer explorer = new Explorer();
            explorer.Run();
        }
        public void Run()
        {
            Object o = null;
            String s;

            try
            {
                // Starts the browser.
                m_IExplorer = new SHDocVw.InternetExplorer();
            }
            catch(Exception e)
            {
                Console.WriteLine("Exception when creating Internet 
                Explorer object {0}", e);
                return;
            }

            // Wires your event handlers to m_IExplorer.
            SetAllEvents();

            try
            {  
                // Goes to the home page.
                m_WebBrowser = (IWebBrowserApp) m_IExplorer;
                m_WebBrowser.Visible = true;
                m_WebBrowser.GoHome();

                // Starts navigating to different URLs.
                Console.Write("Enter URL (or enter to quit): ");
                s = Console.ReadLine();
                while (s != "" && m_IExplorer != null &&
                    m_WebBrowser != null)
                {
                    m_WebBrowser.Navigate(s, ref o, ref o, ref o,
                          ref o);
                    Console.Write("Enter URL (or enter to quit): ");      
                    s = Console.ReadLine();
                }

                m_WebBrowser.Quit();
            }
            catch(Exception sE)
            {
                if (m_IExplorer == null && m_WebBrowser == null)
                {
                    Console.WriteLine("Internet Explorer has gone away");
                }
                else
                {
                    Console.WriteLine("Exception happens {0}", sE);
                }
            }
        }
        // Uses the += syntax for adding delegates to events.
        void SetAllEvents()
        {
            if (m_IExplorer != null)
            {
                // Title Change event
                // DWebBrowserEvents2 is the name of the sink event
                //interface.
                // TitleChange is the name of the event.
                // DWebBrowserEvents2_TitleChangeEventHandler is the 
                // delegate name assigned by TlbImp.exe.
                DWebBrowserEvents2_TitleChangeEventHandler 
                   DTitleChangeE = new DWebBrowserEvents2_TitleChangeEventHandler(OnTitleChange);
                m_IExplorer.TitleChange += DTitleChangeE;
            }
        }
///////////////////////////////////////////////////////////////////////
        // Define event handlers.
        // Document title changed
        static void OnTitleChange(String Text)
        {
            Console.WriteLine("Title changes to {0}", Text);
        }
   
//////////////////////////////////////////////////////////////////////////
        // The following are class fields.
        static private SHDocVw.InternetExplorer m_IExplorer = null;
        static private IWebBrowserApp m_WebBrowser = null;
    }
}

Voir aussi

Tâches

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

Référence

Ildasm.exe (Désassembleur MSIL)

Concepts

Exposition de composants COM au .NET Framework

Autres ressources

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