После некоторых исследований я узнал, что эти точки подключения COM (обработчики событий) указаны с помощью DispId(0)
. Функции обратного вызова представлены экземплярами классов, такими как:
// These attributes may be optional, depending on the project configuration.
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class EventListener
{
[DispId(0)]
// The "target" parameter is an implementation detail.
public void NameDoesNotMatter(object target, IDOMEvent evt) { ... }
}
Поскольку DispId(0)
определяет метод по умолчанию для вызова, фактическое имя метода не имеет значения. Однако параметры метода, безусловно, имеют значение. Например, IHTMLElement.onclick
должен быть присвоен обратный вызов без аргументов, а IHTMLElement2.attachEvent
принимает обратный вызов с одним параметром типа IHTMLEventObj
(или IHTMLEventObj2
, ..., 6
или даже просто object
).
В итоге, обратные вызовы COM IDispatch
могут быть реализованы в C # с использованием видимого COM-класса с методом, который принимает правильные аргументы и помечается [DispId(0)]
.
Несмотря на все это, решения, которые не используют API событий DOM W3C, могут быть более подходящими, поскольку объекты IE9 DOM не поддерживают этот метод, когда браузер использует режим совместимости с более низким режимом документов. Например, расширение, использующее addEventListener
, не будет работать на странице типа Bing, которая отображается в режиме IE7.
Также представляется невозможным установить режим документа, используемый экземпляром IWebBrowser2
, кроме ручного выполнения этого с помощью инструментов разработчика F12.