背景: 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 実装にアタッチする正しい方法は何でしょうか?