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

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. Details zum vorliegenden Abschnitt finden Sie ebenfalls dort unter Behandeln von Ereignissen.

Ein .NET-Client (Ereignissenke) kann Ereignisse empfangen, die durch einen vorhandenen COM-Server (Ereignisquelle) ausgelöst wurden. COM-Interop generiert die notwendigen Delegate in Metadaten, die Sie in den verwalteten Client einfügen. Eine importierte Delegate-Signatur umfasst die Senkenereignis-Schnittstelle, einen Unterstrich, den Ereignisnamen und das Wort EventHandler: SinkEventInterface_EventNameEventHandler.

COM-Objekte, die auf einem .NET-Client Ereignisse auslösen, werden erst nach zweimaliger Ausführung des Garbage Collectors (GC) freigegeben. Der Grund hierfür liegt im Verweiszyklus zwischen COM-Objekten und verwalteten Clients. Wenn ein COM-Objekt explizit freigegeben werden soll, rufen Sie die Collect-Methode zweimal auf.

So arbeiten Sie mit einer vorhandenen COM-Ereignisquelle zusammen

  1. Ermitteln Sie die primäre Interop-Assembly für den COM-Server, wenn die COM-Typen gemeinsam mit anderen Anwendungen genutzt werden sollen. Eine primäre Interop-Assembly enthält Metadaten, welche die konvertierte Typbibliothek repräsentieren, und ist vom Herausgeber signiert.

    HinweisHinweis

    Wenn die primäre Interop-Assembly nicht verfügbar oder für private Verwendung vorgesehen ist, können Sie die Typbibliothek mit dem Typbibliothekimporter (Tlbimp.exe) oder einer äquivalenten API importieren.

    Der Konvertierungsprozess generiert für jedes Ereignis ein Delegat; Sie müssen jedoch nur die für Sie interessanten Ereignisse auffangen.

  2. Sie können zum Identifizieren von Ereignisdelegaten einen Metadatenbrowser verwenden, z. B. MSIL-Disassembler (Ildasm.exe).

  3. Verarbeiten Sie Ereignisse aus der COM-Ereignisquelle genauso wie Ereignisse aus einer verwalteten Ereignisquelle.

Beispiel

Im folgenden Beispiel wird dargestellt, wie ein Internet Explorer-Fenster geöffnet wird und die durch das InternetExplorer-Objekt ausgelösten Ereignisse mit den in verwaltetem Code implementierten Ereignishandlern verbunden werden. Definitionen von Internet Explorer-Typen (inklusive Ereignisdelegaten) werden als Metadaten aus SHDocVw.dll importiert. Im Beispiel wird das TitleChange-Ereignis aufgefangen.

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;
    }
}

Siehe auch

Aufgaben

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

Referenz

Ildasm.exe (MSIL Disassembler-Tool)

Konzepte

Verfügbarmachen von COM-Komponenten für .NET Framework

Weitere Ressourcen

Verwaltete und nicht verwaltete Ereignisse