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
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.
Hinweis 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.
Sie können zum Identifizieren von Ereignisdelegaten einen Metadatenbrowser verwenden, z. B. MSIL-Disassembler (Ildasm.exe).
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