Cómo: Controlar eventos provocados por un origen COM

Si no está familiarizado con el modelo de eventos basado en delegados que proporciona .NET Framework, vea Controlar y provocar eventos.

Un cliente .NET (receptor de eventos) puede recibir eventos provocados por un servidor COM existente (origen de eventos). La interoperabilidad COM genera los delegados necesarios en metadatos que se incluyen en el cliente administrado. Un prototipo de delegado importado está formado por la interfaz de eventos del receptor, un carácter de subrayado, el nombre del evento y la palabra EventHandler: InterfazDeEventosDelReceptor_NombreDelEventoEventHandler.

Observe que los objetos COM que provocan los eventos dentro de un cliente .NET requieren dos colecciones Garbage Collector (GC) antes de ser liberados. Se debe al ciclo de referencia que se produce entre los objetos COM y los clientes administrados. Si necesita liberar un objeto COM explícitamente debe llamar al método Collect dos veces.

Para interoperar con un origen de eventos COM existente

  1. Obtenga el ensamblado de interoperabilidad primario del servidor COM si los tipos COM se van a compartir con otras aplicaciones. Un ensamblado de interoperabilidad primario contiene metadatos que representan la biblioteca de tipos convertidos y está firmado por el editor.

    Nota

    Si el ensamblado de interoperabilidad primario no está disponible o si se va a usar de forma privada, puede usar el Importador de biblioteca de tipos (Tlbimp.exe) o una API equivalente.

    El proceso de conversión genera un delegado para cada evento; sin embargo, sólo es necesario recibir los eventos que se desee.

  2. Puede utilizar un explorador de metadatos, como el Desensamblador MSIL (Ildasm.exe), para identificar los delegados de eventos.

  3. Consuma los eventos del origen de eventos COM de la misma manera que consume los de un origen de eventos administrado.

Ejemplo

En el ejemplo siguiente se muestra cómo se abre una ventana de Internet Explorer y se conectan los eventos provocados por el objeto InternetExplorer con identificadores de eventos implementados en código administrado. Las definiciones de los tipos de Internet Explorer, incluidos los delegados de evento, se importan como metadatos desde el archivo SHDocVw.dll. En el ejemplo se recibe el evento 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;
    }
}

Vea también

Tareas

Cómo: Generar eventos controlados por un receptor COM

Referencia

Ildasm.exe (Desensamblador de MSIL)

Conceptos

Exponer componentes COM en .NET Framework

Otros recursos

Eventos administrados y no administrados