背景:我正在使用标准的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实现的正确方法是什么?
答案 0 :(得分:1)
如果您不使用访问者声明怎么办?
public virtual extern event DWebBrowserEvents2_NewWindow2EventHandler NewWindow2;