Frage

Was ist die „normale“ Wege-Plug-In in kompilierten Sprachen (C # / C / C ++ / D) zu tun? Ich bin speziell interessiert sich sprachunabhängig Ansätze aber sprachspezifisch ist nicht akzeptabel.

Für den Augenblick „Kompilierung“ Plug-in Ansätzen (enthält nur den Code oder nicht, und alles funktioniert) gelten aber die Dinge, die zu einem dynamischeren Ansatz migrieren können, werden bevorzugt.

In Bezug auf den Laufzeittyp, ich bin mehr daran interessiert, in der Mechanik des die Plug-in zu laden und so weiter als die Gestaltung die Plug-in / app-Schnittstelle

EDIT: BTW das Plugin wäre ein Sklave kein Meister. Die grundlegende Wirkung eines Plug-in, das unter einer bestimmten Situation wäre, würde es auf heißen „sein Ding“ und ein Umfeld Objekt gegeben werden, dass es bekommen verwenden, um sollte, was es für den Betrieb benötigt.

War es hilfreich?

Lösung

Für kompilierte Sprachen (wo zusammengestellt bedeutet das Programm als native ausführbare Datei, ohne jede Art von virtuellen Maschine), Sie ziemlich viel Bedarf verwenden irgendeine Art von plattformspezifischen Shared Library Ansatz. In Windows bedeutet dies DLLs verwendet wird.

Sie definieren Ihre Plugin-Schnittstelle in Bezug auf eine Reihe von Funktionen (mit bestimmten Namen, Argumenten und Aufrufkonventionen). Dann laden Sie die Adressen der Funktionen innerhalb der gemeinsam genutzten Bibliothek und gehen in die Stadt. In Windows bedeutet dies unter Verwendung von GetProcAddress () und dann den Rückgabewert auf einen Funktionszeiger des entsprechenden Typs in C Gießen, oder was auch immer das Äquivalent in der Sprache, die Sie verwenden.

Eine weitere Option, die nicht mehr erwünscht sein kann oder wäre eine virtuelle Maschine für eine andere Sprache aus Ihrer nativen Anwendung auszuführen, und hat Plugins Code für diese Sprache sein. Zum Beispiel könnten Sie einen Python-VM mit CPython laufen und dynamisch Python-Module laden.

Andere Tipps

Mono.Addins scheint eine gute Lösung für .NET zu sein. Ich glaube, es API, damit Sie enthält Plugins zum Download (oder Add-Ins) von einem Repo- und es dynamisch laden in eine laufende Montage.

Ich habe festgestellt, dass die harten Teile über Plugins sind: sie zu finden, die Lösung ihre Abhängigkeiten und Version Umgang mit Fragen. Wie Sie diese Fragen behandeln sollen Sie und Ihre Stecker in Autoren klar sein. Wenn Sie diese Fragen falsch, wird es kein Ende der Schmerzen verursachen. Ich würde Skriptsprachen und Anwendungen sehen, die auf Plugins für Ideen verwenden, was gut funktioniert.

Statische Konstruktoren sind mehr als oft nicht, „clever“ im schlechten Sinne. Da Sie laden gehen zu müssen, bis (C / C ++: dlopen und Freunde unter Linux) die Plugins ein zu einer Zeit sowieso (im dynamischen Fall ist), können Sie auch initialisiert sie offensichtlich, wie Sie dies tun. Unter anderem, dass möglicherweise eine Möglichkeit geben, Plugins ablehnen, ohne zu erwarten api.

Beachten Sie, Sie haben keine dynamische Last-Bibliotheken für Plug-ins verwenden. Andere Mechanismen können auch verwendet werden: Shared Memory, Steckdosen, etc ....

Es hängt wirklich davon ab, was Sie tun wollen. Die gemeinsamen Unix-Muster wie in Emacs und dem Gimp gesehen sind, ein Programm zu schreiben, das von einer kleinen kompilierte Komponente besteht, die wesentliche Funktionalität aussetzt, die eine interpretierte Komponente alles zu tun, verwendet. Pluglins, die neue Funktionalität zur Verfügung stellen, die auf der App gebaut werden können, ist einfach, aber Sie müssen in dem primatives sehr flexibel sind Sie dies möglich sein bieten. Am anderen Extrem ein Foto-Editor vorstellen, die in verschiedenen Formaten speichern können. Sie wollen die Menschen ermöglichen, ihre eigenen Dateiformat-Handler zu schreiben. Dies erfordert Code verwendet einen einfachen Satz von Primitiven macht, dann eine Implementierung zur Laufzeit Kommissionierung. In gerade (Unix) C Verwendung dlopen, in C ++ C Verwendung extern, die begrenzt, was Sie tun und dlopen können. In Objective-C haben Sie eine Klasse, die für Sie tun. Im ersten Fall Sie machen oder einen Dolmetscher Wiederverwendung, so dass Sie freien Lauf, es zu tun haben, wie Sie wollen.

Für eine Slave-Typ-Plugin, wo jedes Plugin eine andere Implementierung eines gemeinsamen Satzes von Funktionen kapselt, würde ich nur den DLLs in einem Plugin-Ordner auf die Host-Anwendung (zB „c bekannt deponieren: \ Programme \ myapp \ plugins ) und dann über Reflection die DLLs vom Host anrufen.

Sie könnte tut irgendeine Art von aufwendigem Registrierungsprozess, wenn jede DLL installiert ist, aber ich habe noch nie erlebt Probleme mit der einfachen Plug-in-in-one-Ordner Ansatz.

Edit: Um dies zu tun in C #, fügen Sie nur eine öffentliche Klasse an der DLL (mit dem Namen „Plugin“ oder was auch immer), und implementieren dort benötigte Funktionen. Von Ihrem Host erstellen Sie dann ein Objekt vom Typ Plugin und rufen ihre Methoden (alle Reflexion verwendet wird).

Schnittstellen mit einem Hohlraum Register (Eventsource) scheint gut zu funktionieren - siehe ASP.NET die IHttpModule.Init (Httpapplication ) für ein Beispiel.

Auf diese Weise kann der App Autor (wer kontrolliert Eventsource) Ereignisse nach Bedarf hinzufügen, ohne dass die IPlugin Schnittstelle (zwangsläufig führt zu IPluginEx, IPlugin2, IPlugin2Ex usw.)

erweitern

Ein Ansatz, den ich (in .NET) verwendet haben, ist der Gastgeber machen einen ersten Aufruf der Plugin haben (via Reflection), das Plugin starten und einen Verweis auf den Host vorbei, dass das Plugin speichert. Das Plugin ruft dann Methoden auf dem Host (auch über Reflexion) als notwendig.

Ich denke, mit dem meisten Plugins, würden die Anrufe in der Regel in der anderen Richtung gemacht werden (das heißt der Wirt würde das Plugin als notwendig nennen). In meinem Fall hatte die Plugins selbst UI-Elemente, die Verwendung von Host-Funktionalität machen benötigt.

Low-Level-Modul Umsetzungsfragen zur Seite (zum Beispiel Windows-DLLs und Implementierungsprobleme), ein Spiel-Engine ich nur verwenden, hat eine globale Funktion Registrierung in dem DLLs, und versucht, zu finden und es auf jedem dll im Plugin-Verzeichnis aufrufe. die registartion Funktion nicht jede Buchhaltung notwendige Funktionalität zu belichten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top