2012-07-03 7 views
6

Der Versuch, eine C# NPAPI Plugin zu bauen habe ich eine tutorial gefunden, die beschreibt, dass Ihre DLL eine Reihe von Methoden wie NP_GetEntryPoints, NP_Initialize und NPP_New zusammen mit einer Reihe anderer implementieren muss.Gebäude NPAPI-Plug-in C#

Aber was ich verstehen möchte ist, wenn ich diese Methodennamen einfach spiegeln und äquivalente Datenstrukturen wie in dem Artikel (wie _NPPluginFuncs) in C# beschrieben konstruieren kann und alles wird funktionieren?

Könnte jemand bitte freundlich genug sein, eine Anleitung zu geben? Ist es möglich, in C# ein NPAPI-Plugin zu erstellen, und wenn ja, in welchen grundlegenden Schritten?

+0

Jemand da draußen am Leben? : -p –

+3

Ich kann Ihnen keine detaillierte Antwort auf NPAPI speziell geben, aber im Allgemeinen ist die Verwendung von C# zum Erstellen einer DLL mit C-kompatiblen exportierten Funktionen nicht möglich. Sie könnten entweder 1) schaffen eine Mixed-Mode-C++ DLL, oder (wahrscheinlicher, wenn Sie sich wohler in C# als Managed C++) 2) Erstellen Sie eine kleine nativen DLL Ihre Exporte enthält, die COM verwendet Interop ein Assembler geschrieben verwaltet zu delegieren in C# und enthält den Großteil Ihrer Funktionalität. – shambulator

+0

Nun, das ist im Grunde eine Antwort. Ich nahm an, dass in einem schlimmeren Fall irgendeine Art von Interop möglich wäre (wenn auch nicht über c genug wußte ++ COM zu übernehmen), aber ich dachte auch es wäre ein einfacher Weg für Interop zwischen C++ und C# –

Antwort

4

Wie in der Dokumentation angegeben:

A NPAPI Browser-Plugin ist, es Kern ist, einfach eine DLL mit einigen spezifischen Einspeisepunkten

Das heißt, Sie eine Funktion exportieren, müssen aus eine reguläre DLL, die normalerweise in C/C++ gemacht wird. Leider ist es nicht möglich, einen Einstiegspunkt aus einer einfachen C# dll, but look at this answer, mit etwas Aufwand zu offenbaren, es scheint, als wäre es möglich, einen Export durch irgendeine Art von Post-Build-Tool auszutricksen.

In jedem Fall nicht erwarten, zu viele komplizierte Datenstrukturen von/zu den Plugin-Schnittstellen zu übergeben, wird es ein Schmerz sein. Wenn Sie mehr Forschung betreiben möchten, ist die zu verwendende Schlüsselarbeit "reverse P/Invoke", in Analogie zu direktem P/Invoke, das reguläre DLL von gemanagter Welt aufruft.

Der Grund, warum eine C# -Dll nicht direkt "Einstiegspunkte" aussetzen kann, ist, dass Einstiegspunkt eigentlich nur einige Adressen innerhalb der DLL sind, die zu einigen Assembly-Code sofort ausführbar. C# DLL sind verschiedene Arten von Biest: Sie sind nur Dateien mit IL, die "Just In Time" kompiliert wird und in der Tat solche Kompilierung gezwungen ist AFAIK with some OS tricks. Dies ist der Grund, warum reverse P/Invoke überhaupt nicht starightforward ist.

+0

, die tatsächlich die genaue Aussage, die mich „ist ein NPAPI Browser-Plugin, um es Kern ist, einfach eine DLL mit ein paar spezifische Einstiegspunkte“ verwirrt - Mein erster Gedanke war ‚Große, so kann ich dies in C# schreiben‘ ich denke, ich nie wirklich darüber nachgedacht, wie DLLs 'Einstiegspunkte' implementieren und immer angenommen haben, dass die 'Einstiegspunkte' in C++ und C# gleich funktionieren würden. Im Nachhinein ein dummer Gedanke, aber ich habe nie eine Zeile von C++ geschrieben –

+0

@MaximGershkovich ich die Antwort aktualisiert haben –

+0

Danke, ich schätze die Klarstellung. –

4

Wie Georg Fritzsche sagt in seinem Kommentar:

NPAPI Plugins sind im Grunde DLLs mit wenigen erforderlichen C-Exporte

und es gibt keine integrierte Möglichkeit, Funktionen zu exportieren (in der C-Export Sinn) von einer Assembly geschrieben in C#.

Einige Ihrer Optionen sind:

  1. Ein Mixed-Mode-C++ Baugruppe, die direkt die Funktionen exportieren. Dies könnte Auswirkungen auf das Hosting der CLR im Hostprozess Ihres Plugins haben.
  2. Eine kleine native DLL, die die Exporte hostet, verwendet dann COM-Interop, um an eine C# -Assembly zu delegieren, die die Plugin-Funktionalität enthält. Die "offizielle" Art, so etwas zu tun, ist "reverse p/invoke".
  3. Ein intriguing project, der Ihre vollständig verwaltete Assembly nachbearbeitet, indem statische Methoden, die mit einem benutzerdefinierten Attribut gekennzeichnet sind, in benannte Funktionsexporte umgewandelt werden. (Ich habe keine Zugehörigkeit zu diesem Projekt; ich bin darüber gestolpert, nachdem ich mich gefragt habe, ob jemand den COM-Interop-Weg der Dinge verbessert hat.)
+0

Vielen Dank, dies in graben in die Frage, die ich eigentlich fragte, aber wusste nicht, wie man ausdrückt. –