将事件绑定到COM接口

时间:2013-07-15 15:26:45

标签: c# event-handling com-interop shdocvw

背景:我正在使用标准的WebBrowser控件,它是System.Windows.Forms的一部分,它实际上是Internet Explorer COM控件的包装器,以便使用包装器未公开的功能我正在使用ActiveXInstance属性getter并将其转换为基础COM类型(或实际上是Visual Studio在引用COM类型~Interop.ShDocVw.dll时自动为您创建的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,但编译器报告“添加或删除访问者必须具有正文”。如果我添加一个空体,那么编辑会报告:

  

SHDocVw.WebBrowserClass.NewWindow2.add'不能是extern并声明一个正文

那么将事件附加到COM实现的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您不使用访问者声明怎么办?

public virtual extern event DWebBrowserEvents2_NewWindow2EventHandler NewWindow2;