共用方式為


HOW TO:處理 COM 來源所引發的事件

如果您不熟悉 .NET Framework 所提供的委派架構事件模型,請參閱處理和引發事件。 如需適用於這個章節的特定詳細資訊,請參閱同一節中的使用事件

.NET 用戶端 (事件接收) 可以接收由現有 COM 伺服器 (事件來源) 所引發的事件。 COM Interop 會在包括在 Managed 用戶端的中繼資料中產生必要的委派。 匯入的委派簽章由接收事件介面、底線、事件名稱和文字 EventHandler 所組成:SinkEventInterface_EventNameEventHandler。

請注意,於 .NET 用戶端中引發事件的 COM 物件在發行前需要兩個記憶體回收行程 (GC) 集合。 這是由於 COM 物件和 Managed 用戶端間發生的參考循環所造成的。 如果您需要明確發行 COM 物件,則應呼叫 Collect 方法兩次。

若要與現有 COM 事件來源互通

  1. 如果 COM 型別要與其他應用程式共用,取得 COM 伺服器的主要 Interop 組件。 主要 Interop 組件含有代表已轉換之型別程式庫,並且已由發行者簽名的中繼資料。

    注意事項注意事項

    如果沒有主要 Interop 組件,或組件是做為私用,您可以使用型別程式庫匯入工具 (Tlbimp.exe) 或相等的 API 匯入型別程式庫。

    轉換處理序會對每一事件產生一個委派;不過,您只需接收您有興趣的事件。

  2. 您可以使用中繼資料 (Metadata) 瀏覽器來辨識事件委派,例如 MSIL 反組譯工具 (Ildasm.exe)

  3. 依照您從 Managed 事件來源使用事件的同樣方式,從 COM 事件來源使用事件。

範例

下列範例示範如何開啟 [Internet Explorer] 視窗,並且將 InternetExplorer 物件引發的事件連接到在 Managed 程式碼中實作的事件處理常式。 Internet Explorer 型別的定義 (包括事件委派) 是以中繼資料的方式從 SHDocVw.dll 中匯入。 這個範例會接收 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;
    }
}

請參閱

工作

HOW TO:引發由 COM 接收所處理的事件

參考

Ildasm.exe (MSIL 反組譯工具)

概念

將 COM 元件公開給 .NET Framework

其他資源

Managed 和 Unmanaged 事件