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.
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
.
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.
Tags und Links .net c# com com-interop webbrowser-control