WebBrowserSite: как вызвать частный метод интерфейса COM в производном классе?

Вот проблема. Я'м вытекает из рамокWebBrowserSite учебный класс. Экземпляр моего производного класса,ImprovedWebBrowserSite, возвращается черезWebBrowser.CreateWebBrowserSiteBase, который я переопределяю в моей производной версииWebBrowser класс - специально для предоставления пользовательского объекта сайта. РамкиWebBrowser реализация далее передает его в базовый неуправляемый элемент управления ActiveX WebBrowser.

Пока что яудалось переопределитьIDocHostUIHandler в моемImprovedWebBrowserSite реализация (какэтот). Я'Сейчас я ищу более основные интерфейсы COM, такие какIOleClientSiteкоторый я хочу передатьWebBrowserSite, Все они подвергаются COM сComImport, но объявлен какprivate или жеinternal Рамочнойs реализация /WebBrowserSiteUnsafeNativeMethods, Таким образом, я не могуявно повторно реализовать их в производном классе. Я должен определить свои собственные версии, как я сделал с.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-таблицу.

Ответы на вопрос(2)

Ваш ответ на вопрос