Фон: Я использую стандартный элемент управления WebBrowser, который является частью System.Windows.Forms, который на самом деле является оберткой над COM-контроллером Internet Explorer, чтобы использовать функциональные возможности, не отображаемые wrapper Я использую getter свойства ActiveXInstance и отсылаю его к базовому типу COM (или фактически классу 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;
}
}
Несмотря на аксессору события помечаются, как Экстерн отчеты компилятора «надстройка или удалить аксессор должен иметь тело ". Если добавить пустое тело им отчеты comiler:
SHDocVw.WebBrowserClass.NewWindow2.add»не может быть ехЬегп и объявить тело
Так что правильный способ прикрепить событие к COM-реализация?
Это компилируется, но атрибут связывания «MethodImpl» не существует. Если я помещаю его в объявление события, тогда компилятор сообщает об ошибке «Атрибут« MethodImpl »недействителен для этого типа объявления. Он действителен только для объявлений« конструктор, метод ». – redcalx
Событие - это не метод. Аксессоры - это методы, но я уверен, что вам не нужно их объявлять. Декомпилятор IL будет видеть эти элементы и выводить код для них, но я не думаю, что вы должны использовать его. Если вы скомпилируете его, ваш код бросает ошибки при попытке использовать событие? – randcd
Я попробую. Я думаю, что это может быть проблемой с декомпилятором - я не вижу этих атрибутов, определенных в add/remove accessors в декомпрессии, для IL. – redcalx