Condividi tramite


Procedura: gestire gli eventi generati da un'origine COM

Se non si ha familiarità con il modello eventi basato sui delegati fornito da .NET Framework, vedere Gestione e generazione di eventi.

Un client .NET (sink di evento) è in grado di ricevere gli eventi generati da un server COM esistente (origine evento). L'interoperabilità COM genera i delegati necessari nei metadati che lo sviluppatore include nel proprio client gestito. La firma di un delegato importato comprende l'interfaccia del sink di evento, un carattere di sottolineatura, il nome dell'evento e la parola EventHandler: InterfacciaSinkEvento_NomeEventoEventHandler.

Si noti che gli oggetti COM che generano eventi all'interno di un client .NET richiedono due raccolte Garbage Collector prima del rilascio, a causa del ciclo di riferimenti che si crea tra oggetti COM e client gestiti. Se occorre rilasciare in modo esplicito un oggetto COM, è necessario chiamare il metodo Collect due volte.

Per interoperare con un'origine evento COM esistente

  1. Se i tipi COM devono essere condivisi da altre applicazioni, ottenere l'assembly di interoperabilità primario per il server COM. Un assembly di interoperabilità primario contiene i metadati che rappresentano la libreria dei tipi convertita ed è firmato dall'editore.

    Nota

    Se l'assembly di interoperabilità primario non è disponibile o se l'assembly deve essere utilizzato in modo privato, sarà possibile importare la libreria dei tipi tramite l'utilità di importazione della libreria dei tipi (Tlbimp.exe) o un'API equivalente.

    Il processo di conversione genera un delegato per ciascun evento. È comunque necessario predisporre sink per i soli eventi che interessano.

  2. Per identificare i delegati di evento, è possibile utilizzare un visualizzatore di metadati come Disassembler MSIL (Ildasm.exe).

  3. Utilizzare gli eventi generati dall'origine COM allo stesso modo in cui si utilizzano gli eventi generati dalle origini eventi gestite.

Esempio

Nell'esempio che segue viene illustrato come aprire una finestra di Internet Explorer e collegare gli eventi generati dall'oggetto InternetExplorer a gestori eventi implementati nel codice gestito. Le definizioni dei tipi di Internet Explorer (inclusi i delegati di evento) vengono importate come metadati da SHDocVw.dll. Nell'esempio vengono creati i sink dell'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;
    }
}

Vedere anche

Attività

Procedura: generare eventi gestiti da un sink COM

Riferimenti

Ildasm.exe (disassemblatore MSIL)

Concetti

Esposizione di componenti COM a .NET Framework

Altre risorse

Eventi gestiti e non gestiti