1

背景: System.Windows.Forms の一部である標準の WebBrowser コントロールを使用しています。これは実際には Internet Explorer COM コントロールのラッパーです。ラッパーによって公開されていない機能を使用するために、ActiveXInstance プロパティ ゲッターを使用しています。それを基になる COM 型 (または実際には、COM 型 ~ Interop.ShDocVw.dll を参照するときに Visual Studio が自動的に作成する COM 相互運用クラス) にキャストします。

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 としてマークされているにもかかわらず、コンパイラーは「追加または削除アクセサーには本体が必要です」と報告します。空の本文を追加すると、コミラーは次のように報告します。

SHDocVw.WebBrowserClass.NewWindow2.add' を extern にして本体を宣言することはできません

では、イベントを COM 実装にアタッチする正しい方法は何でしょうか?

4

1 に答える 1

1

アクセサー宣言を省略したらどうなるでしょうか。

public virtual extern event DWebBrowserEvents2_NewWindow2EventHandler NewWindow2;
于 2013-07-15T15:34:12.523 に答える