Como: Manipular eventos gerados por uma fonte COM
Se você não estiver familiarizado com o modelo de eventos com base no delegado fornecido pelo .NET estrutura, consulte Manipulando e aumentando a eventos.Para obter detalhes específicos que se aplicam a esta seção, consulte Consumindo eventos na mesma seção.
Um cliente .NET (coletor de eventos) pode receber eventos gerados por um servidor COM existente (fonte do evento).Interoperabilidade COM gera os delegados necessários em metadados que você incluiu no seu cliente gerenciado.Uma assinatura do delegado importados compreende a interface de coletor de eventos, um sublinhado, o nome do evento e a palavra EventHandler: SinkEventInterface_EventNameEventHandler.
Observe que objetos COM que disparam eventos dentro de um cliente .NET requerem duas coleções coletor de lixo (GC) antes que eles são lançados.Isso é causado pelo ciclo de referência que ocorre entre objetos COM e clientes gerenciado.Se você precisar liberar explicitamente um objeto COM, você deve chamar o Collect método duas vezes.
Para interoperar com uma fonte do evento COM existente
Obtenha o assembly de interoperabilidade primário para o servidor COM se tipos COM estão a ser compartilhada por outros aplicativos.Um assembly de interoperabilidade primário contém metadados que representa a biblioteca de tipos convertidos e está assinado pelo publicador.
Observação: Se o assembly de interoperabilidade primário não está disponível ou se o assembly for ser usado em particular, você pode importar a biblioteca de tipos usando o Tipo biblioteca Importer (Tlbimp.exe) ou uma API equivalente.
O processo de conversão gera um delegado para cada evento; no entanto, você apenas ter coletar eventos de interesse.
Você pode usar um navegador de metadados, sistema autônomo a Desassemblador do MSIL (ILDASM.exe), identificar eventos delegados.
Consumir eventos da origem do evento COM da mesma maneira que consumam eventos a partir de uma fonte de eventos gerenciado.
Exemplo
O exemplo a seguir demonstra como em em aberto uma janela do Internet Explorer e amarrar eventos gerados pelo InternetExplorer objeto para manipuladores de eventos implementados em código gerenciado. Definições de tipos do Internet Explorer (incluindo representantes do evento) são importadas sistema autônomo metadados do SHDocVw.dll.O exemplo coletores o TitleChange evento.
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;
}
}
Consulte também
Tarefas
Como: Elevar eventos tratados por um coletor COM
Conceitos
Expondo componentes COM para o .NET estrutura
Referência
Desassemblador do MSIL (ILDASM.exe)