2009-12-06 7 views
9

Wir entwickeln eine Anwendung, die eine Plug-in "-Architektur" haben wird, um es den Konsumenten der App zu ermöglichen stellen ihre eigenen proprietären Algorithmen zur Verfügung. (Wir werden grundsätzlich eine Reihe von Parsern haben und Dritten erlauben, auch ihre eigenen zu liefern)Empfehlung für C++ - Wrapper für plattformübergreifende dynamische Bibliotheksbindungen (dh ein leichtes, leistungsstarkes COM oder CORBA)

Der Domainraum erfordert sehr hohe Leistung, so dass Out-of-Process-Bindings nicht funktionieren und wir lieber gehen die Schwergewichte wie CORBA und COM allein.

Grundsätzlich suchen wir nach einem einfachen Cross-Plattform-Wrapper um:

  • Ladebibliothek von einem relativen Pfad
  • eine Zuordnung der jeweiligen dll bieten/.so zu einem gewissen Konfiguration/namen
  • eine Initialisierung tun und die Bibliothek abfragen, um sicherzustellen, dass sie die notwendige Funktionalität

ich denke, das ist wirklich nur eine Umhüllung um Loadlibrary() und die Methodenaufrufe bieten exportiert. Wir können das selbst schreiben, aber wir würden lieber vorhandenen Code verwenden, da wir genug auf unserem Teller haben.

Auch hier sind Durchsatz und Leistung sehr wichtig.

ähnliche Fragen sind:

Cross-platform alternative to COM - das ein in der Nähe ist, aber wir wollen nur in-Prozess - keine Notwendigkeit für außerhalb des Prozesses und unsere Bedürfnisse sind ein wenig „geringeres Gewicht“.

C++ Cross Platform Dynamic Libraries; Linux and Windows

Dies ist für nicht verwaltete C++ - wir nicht .NET

bearbeiten können - was wir

gefunden Wir fanden, dass Poco für unsere Bedürfnisse funktioniert gut. Als Bonus ist This page ein sehr geschätzter Kommentar zum Stand der C++ - Entwicklung und der Sprachrichtung ...

Es war eine einfache plattformübergreifende Verpackung, die wir von Poco benötigten. Wirklich, es gibt nicht viel, aber spart uns Zeit und Tests. Kein zusätzlicher Overhead während der Laufzeit

+1

Ich glaube nicht, dass jemand dies ausdrücklich in-Prozess zu tun hat gestört. XPCOM ist das Beste, was einem einfällt. –

+0

poco scheint den Trick zu tun – Tim

+0

@Tim: Mein Kommentar ist eher mit der Idee von _a Plug-in "Architektur", um den Verbrauchern der App zu ermöglichen, ihre eigenen proprietären Algorithmen zur Verfügung zu stellen. So zielt mein Projekt die gleiche Funktionalität, aber wir haben ein ernstes Problem, dass, wenn Benutzercode eine Endlosschleife durchläuft, der Thread, auf dem der verwendete Code läuft, einen Kern der CPU sperrt, wodurch die Leistung verringert wird. Einige, wie dieser Thread gestoppt werden muss. Hast du das gleiche Problem? Wenn ja, was ist Ihre Lösung? –

Antwort

4

Die Bibliothek ACE enthält Wrapper für das Laden dynamischer Bibliotheken, die plattformübergreifend arbeiten. Wenn Sie mehr Komfort als einfache loadlibrary wollen dann sehen Sie sich TAO Die ACE ORB. Die Verwendung von Corba mit TAO ist extrem performant und übertrifft wahrscheinlich jede selbst erstellte Plugin-Infrastruktur, besonders wenn Sie in Prozessaufrufen arbeiten, da TAO diese optimiert.

Verwenden Sie den plattformübergreifenden Wrapper für die dynamische Bibliothek ACE_DLL. Es bietet den einfachsten plattformübergreifenden Wrapper um loadlibrary(), den Sie erwähnt haben.

Zwischen der Verwendung von ACE_DLL und der Verwendung von TAO steht die service configuration framework von ACE, mit der Sie Objekte dynamisch laden können. Nach dem Laden können Sie einen Upcast-Zeiger auf das geladene Objekt erhalten, das Sie implementiert haben, und Sie können eine beliebige Methode für das geladene Objekt aufrufen.

Der Code zu tun, würde wie folgt aussehen:

char const * const cpc_myClass = ACE_DYNAMIC_SERVICE_DIRECTIVE(
    "myclass", 
    "dllname", 
    "_make_MyClass", 
    "" 
); 
result = ACE_Service_Config::process_directive(cpc_myClass); 
MyClass * p_obj = ACE_Dynamic_Service<MyClass>::instance ("myclass"); 
p_obj->callAnyMethodYouLike(); 

Here wird erklärt, dass TAO kennt zwei Arten von Colocation-Optimierung (thru_poa und direkt):

Bei Verwendung der direkten Strategie, Methodenaufrufe auf verknüpften Objekten werden direkte Aufrufe an Servant, ohne den Status der POA zu überprüfen.

Sie könnten erstaunt sein, wie effektiv TAO bei richtiger Anwendung sein kann. Ich schlage vor, einen einfachen Proof of Concept zu erstellen und Messungen durchzuführen.

+0

Ich bin vertraut mit ACE - ich brauche nicht die "Schwergewicht" Cross-Prozess oder Cross Machine Bindings. Ich kann mir nicht vorstellen, dass ACE in der Nähe der Leistung eines virtuellen Anrufs ist. Wie hoch ist der Aufwand eines ACE-Anrufs? – Tim

+1

Wenn Sie die Klasse ACE_DLL verwenden, gibt es keine Cross-Prozessaufrufe. Vielleicht sind Sie mit ACE nicht vertraut genug? Sogar mit TAO können Sie ein "direktes" Mapping generieren, das im Grunde nur einen virtuellen Aufruf ausführt, wenn das aufgerufene Objekt im selben Prozess ist. – lothar

+0

+1 Ja, ich hatte ACE als Corba-Implementierung verwendet - nicht ace_dll - danke für den Vorschlag – Tim