2013-07-15 1 views
0

Фон: Я использую стандартный элемент управления 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-реализация?

ответ

1

Что делать, если вы отказались от объявлений о доступе?

public virtual extern event DWebBrowserEvents2_NewWindow2EventHandler NewWindow2; 
+0

Это компилируется, но атрибут связывания «MethodImpl» не существует. Если я помещаю его в объявление события, тогда компилятор сообщает об ошибке «Атрибут« MethodImpl »недействителен для этого типа объявления. Он действителен только для объявлений« конструктор, метод ». – redcalx

+1

Событие - это не метод. Аксессоры - это методы, но я уверен, что вам не нужно их объявлять. Декомпилятор IL будет видеть эти элементы и выводить код для них, но я не думаю, что вы должны использовать его. Если вы скомпилируете его, ваш код бросает ошибки при попытке использовать событие? – randcd

+0

Я попробую. Я думаю, что это может быть проблемой с декомпилятором - я не вижу этих атрибутов, определенных в add/remove accessors в декомпрессии, для IL. – redcalx