2013-07-15 107 views
0

背景:我使用的標準WebBrowser控件是System.Windows.Forms的一部分,它實際上是Internet Explorer COM控件的一個包裝,以便使用未由包裝我使用ActiveXInstance屬性getter並將其轉換爲基礎COM類型(或實際上是Visual Studio在引用COM類型〜Interop.ShDocVw.dll時自動爲您創建的COM interop類)。將事件綁定到COM接口

現在爲了避免發送整個Interop.ShDocVw.dll我試圖編譯只有我想要實現的代碼的顯着部分,所以我正在查看反編譯的Interop.ShDocVw.dll和試圖只複製我需要的代碼段。奇怪的是,作爲反編譯的ILSpy代碼不實際編譯,特別是這些事件訪問編譯失敗:

[DefaultMember("Name"), ClassInterface((short)0), ComSourceInterfaces("SHDocVw.DWebBrowserEvents2\0SHDocVw.DWebBrowserEvents\0"), Guid("8856F961-340A-11D0-A96B-00C04FD705A2"), TypeLibType(34)] 
[ComImport] 
public class WebBrowserClass : IWebBrowser2, WebBrowser 
{ 
    [MethodImpl(MethodImplOptions.InternalCall)] 
    public extern WebBrowserClass(); 

    public virtual extern event DWebBrowserEvents2_NewWindow2EventHandler NewWindow2 
    { 
     [MethodImpl(MethodImplOptions.InternalCall)] 
     add; 
     [MethodImpl(MethodImplOptions.InternalCall)] 
     remove; 
    } 

    [DispId(210)] 
    public virtual extern string LocationName 
    { 
     [DispId(210)] 
     [MethodImpl(MethodImplOptions.InternalCall)] 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
    } 
} 

儘管事件訪問被標記爲extern編譯器會報告「添加或刪除訪問必須有一個身體「。如果我添加一個空的身體他們comiler報告:

SHDocVw.WebBrowserClass.NewWindow2.add」不能是extern和聲明主體

那麼什麼是一個事件附加到一個正確的方法COM實現?

回答

1

如果您遺漏了訪問器聲明會怎麼樣?

public virtual extern event DWebBrowserEvents2_NewWindow2EventHandler NewWindow2; 
+0

編譯,但無處可放'MethodImpl'COM綁定屬性。如果我把它放在事件聲明上,那麼編譯器報告錯誤「Attribute'MethodImpl'在這個聲明類型上是無效的,它只對'構造函數,方法'聲明有效。 – redcalx

+1

事件不是一種方法。訪問器是方法,但我很確定你不必聲明它們。 IL反編譯器會看到這些項目併爲它們輸出代碼,但我認爲你不必使用它。如果您編譯它,嘗試使用該事件時,您的代碼是否會發生錯誤? – randcd

+0

我會試試看。我認爲這可能是反編譯器的一個問題 - 我沒有看到在IL中解釋中的添加/刪除訪問器上定義的那些屬性。 – redcalx