WebBrowserSite: Wie wird eine private COM-Schnittstellenmethode in einer abgeleiteten Klasse aufgerufen?

8

Hier ist die Herausforderung. Ich komme von der co_de% Klasse. Eine Instanz meiner abgeleiteten Klasse WebBrowserSite wird über ImprovedWebBrowserSite , die ich in meiner abgeleiteten Version von WebBrowser.CreateWebBrowserSiteBase Klasse - speziell um ein benutzerdefiniertes Site-Objekt bereitzustellen. Die WebBrowser - Implementierung des Frameworks leitet sie weiter an das zugrunde liegende nicht verwaltete WebBrowser-ActiveX-Steuerelement weiter.

Bisher habe ich WebBrowser in meiner IDocHostUIHandler -Implementierung überschrieben (wie dies ). Ich bin jetzt auf der Suche nach mehr Core-COM-Schnittstellen, wie ImprovedWebBrowserSite , die ich an IOleClientSite weitergeben möchte. Sie alle sind COM mit WebBrowserSite ausgesetzt, werden jedoch durch die Implementierung von ComImport / private als internal oder WebBrowserSite deklariert. Daher kann ich nicht sie explizit in den abgeleiteten implementieren Klasse. Ich muss meine eigenen Versionen definieren, wie ich es mit UnsafeNativeMethods gemacht habe.

Die Frage ist also, wie kann ich eine Methode einer privaten oder internen COM-Schnittstelle aufrufen, die in IDocHostUIHandler von meiner abgeleiteten Klasse definiert ist? Zum Beispiel möchte ich WebBrowserSite aufrufen . Ich kann Reflektionen verwenden (wie dies ), aber das wäre der letzte Ausweg, um IOleClientSite.GetContainer wieder zu implementieren scratchen.

Ich denke, weil das private WebBrowser des Frameworks und mein eigenes UnsafeNativeMethods.IOleClientSite beide COM -Schnittstellen sind, die mit dem ImprovedWebBrowserSite.IOleClientSite -Attribut, derselben GUID und identischen Methodensignaturen deklariert sind. Es gibt COM Type Equivalence in .NET 4.0+, also muss es einen Weg geben, es zu tun ohne Reflexion.

[UPDATE] Jetzt, wo ich eine Lösung habe, glaube ich, dass sie eröffnet wird einige neue und interessante Möglichkeiten, die WinForms-Version von ComImport anzupassen Kontrolle.

Diese Version der Frage wurde erstellt, nachdem mein erster Versuch , das Problem in einer abstrakteren Form zu formulieren, als irreführend bezeichnet wurde von einem Kommentator. Der Kommentar wurde später entfernt, aber ich habe beschlossen, beide Versionen zu behalten.

Warum wollte ich die Reflektion nicht verwenden, um dieses Problem zu lösen? Aus ein paar Gründen:

  • Abhängigkeit von den tatsächlichen symbolischen Namen der internen oder privaten Methoden, wie von den Implementierern von WebBrowser angegeben, im Gegensatz zu einer COM-Schnittstelle, bei der es sich um den binären v-table-Vertrag handelt.

  • Sperriger Reflexionscode. Ziehen Sie beispielsweise in Betracht, das private WebBrowserSite über% co_de aufzurufen %, und ich habe ~ 20 Methoden wie diese zu nennen.

  • Obwohl weniger wichtig, Effizienz: Ein spät gebundener Aufruf über Reflektion ist immer weniger effizient als ein direkter Aufruf einer COM-Schnittstellenmethode über v-table.

Noseratio 31.10.2013, 22:37
quelle

2 Antworten

7

Schließlich glaube ich, dass ich das Problem mit Marshal.CreateAggregatedObject gelöst habe, mit etwas Hilfe von @EricBrown.

Hier ist der Code, der das Anpassen von WebBrowserSite OLE-Schnittstellen ermöglicht, indem Sie IOleClientSite als Beispiel verwenden und die private COM-sichtbare Implementierung von WebBrowserSite aufrufen. Es kann auf andere Schnittstellen erweitert werden, z. IDocHostUIHandler .

%Vor%     
Noseratio 02.11.2013, 07:00
quelle
4

Nur ein Gedanke, aber vielleicht können Sie einen Teil des Quellcodes von hier verwenden. Du würdest es wieder einführen, aber es könnte dir geben, was du willst.

    
Danexxtone 01.11.2013 12:47
quelle