WebBrowserSite: как вызвать частный метод интерфейса COM в производном классе?
Вот проблема. Я'м вытекает из рамокWebBrowserSite
учебный класс. Экземпляр моего производного класса,ImprovedWebBrowserSite
, возвращается черезWebBrowser.CreateWebBrowserSiteBase
, который я переопределяю в моей производной версииWebBrowser
класс - специально для предоставления пользовательского объекта сайта. РамкиWebBrowser
реализация далее передает его в базовый неуправляемый элемент управления ActiveX WebBrowser.
Пока что яудалось переопределитьIDocHostUIHandler
в моемImprovedWebBrowserSite
реализация (какэтот). Я'Сейчас я ищу более основные интерфейсы COM, такие какIOleClientSite
который я хочу передатьWebBrowserSite
, Все они подвергаются COM сComImport
, но объявлен какprivate
или жеinternal
Рамочнойs реализация /WebBrowserSite
UnsafeNativeMethods
, Таким образом, я не могуявно повторно реализовать их в производном классе. Я должен определить свои собственные версии, как я сделал с.IDocHostUIHandler
Итак, вопрос в том, как я могу вызвать метод частного или внутреннего интерфейса COM, определенного вWebBrowserSite
из моего производного класса? Например, я хочу позвонитьIOleClientSite.GetContainer
, Я могу использовать отражение (какэтот), но это было бы последним средством, вторым после повторной реализацииWebBrowser
с нуля.
Я думаю, потому что рамкис частнымUnsafeNativeMethods.IOleClientSite
и мой собственныйImprovedWebBrowserSite.IOleClientSite
обаCOM интерфейсы, объявленные сComImport
атрибут, тот же GUID и идентичные сигнатуры метода. Там вЭквивалентность типа COM в .NET 4.0+, поэтому должен быть способ сделать это без размышлений.
[ОБНОВИТЬ] Теперь, когда яу меня естьрешениеЯ считаю, что это открывает некоторые новые и интересные возможности в настройкеВерсия WinForms изWebBrowser
контроль.
Эта версия вопроса была создана послемоя первая попытка Комментатор вводил в заблуждение формулировку проблемы в более абстрактной форме. Комментарий был удален позже, но я решил оставить обе версии.
Почему я не хотел использовать рефлексию для решения этой проблемы? По нескольким причинам:
Зависимость от фактических символических имен внутренних или частных методов, как это дано исполнителямиWebBrowserSite
В отличие от COM-интерфейса, который касается контракта на двоичные v-таблицы.
Громоздкое отражение кода. Например, рассмотрите возможность вызова базыс частнымTranslateAccelerator
с помощьюType.InvokeMember
и у меня есть ~ 20 таких методов, чтобы вызвать.
Хотя это и менее важно, эффективность: вызов с поздним связыванием через отражение всегда менее эффективен, чем прямой вызов метода интерфейса COM через v-таблицу.