Share via


Como: Manipular eventos gerados por uma fonte COM

Se você não estiver familiarizado com o modelo de evento com o delegado fornecido pelo.NET Framework, consulte Handling and Raising Events. Para obter detalhes específicos que se aplicam a esta seção, consulte Consumindo eventos na mesma seção.

A.Cliente de rede (coletor de eventos) pode receber eventos gerados por um servidor existente do COM (origem de evento). Interoperabilidade COM gera os delegados necessários em metadados que você incluir 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 elevar eventos dentro de um.NET cliente exigem duas coleções de coletor de lixo (GC) antes de serem lançados. Isso é causado por um ciclo de referência que ocorre entre objetos COM e clientes gerenciados. Se você precisar liberar explicitamente um objeto COM deve chamar o Collect método duas vezes.

Para interoperar com uma fonte de evento COM existente

  1. Obtenha o assembly de interoperabilidade primário para o servidor COM, se forem de tipos COM a ser compartilhada por outros aplicativos. Um assembly de interoperabilidade primária contém metadados que representa a biblioteca de tipos convertidos e está assinado pelo editor.

    Observação

    Se o assembly de interoperabilidade primário não está disponível ou se o assembly a ser usado em particular, você pode importar a biblioteca de tipos usando o Type Library Importer (Tlbimp. exe) ou uma API equivalente.

    O processo de conversão gera um delegado para cada evento; No entanto, você só precisará coletar os eventos que lhe interessam.

  2. Você pode usar um navegador de metadados, como o O Desassemblador do MSIL (Ildasm. exe), para identificar os delegados de eventos.

  3. Consuma eventos de origem de evento COM da mesma maneira que você consumir eventos de uma fonte de eventos gerenciado.

Exemplo

O exemplo a seguir demonstra como abrir uma janela do Internet Explorer e como amarrar eventos gerados pelo InternetExplorer o objeto para manipuladores de eventos implementados em código gerenciado. Definições de tipos do Internet Explorer (incluindo representantes do evento) são importadas como metadados do Shdocvw. dll. O exemplo de Coletores de TitleChange de 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: Gerar eventos manipulados por um coletor COM

Referência

Ildasm. exe (desmontador MSIL)

Conceitos

Expondo componentes COM para o.NET Framework

Outros recursos

Eventos gerenciados e não gerenciados