2009-12-06 8 views
9

Nous développons une application qui aura une «architecture» de plug-in pour permettre aux utilisateurs de l'application de fournir leurs propres algorithmes propriétaires. (Nous aurons essentiellement un ensemble de parseurs et permettra à des tiers de fournir eux aussi)Recommandation pour l'encapsuleur C++ pour les liaisons de bibliothèques dynamiques inter-plateformes en cours (c.-à-d. Un COM ou un CORBA léger et performant)

L'espace de domaine nécessite de très hautes performances, donc les liaisons hors-process ne fonctionneront pas et nous préférons partir les choses lourdes comme CORBA et COM seul.

Fondamentalement, nous sommes à la recherche d'un simple emballage multi-plateforme autour de:

  • bibliothèque de chargement à partir d'un chemin relatif
  • fournir une cartographie de la dll particulier/.so dans une certaine configuration/nom
  • faire une initialisation et d'interroger la bibliothèque pour assurer qu'elle fournit les fonctionnalités nécessaires

Je pense que c'est vraiment juste un emballage autour loadlibrary() et les appels de méthode exporté. Nous pouvons l'écrire nous-mêmes, mais nous préférons utiliser le code existant car nous en avons assez dans notre assiette.

Encore une fois, le débit et les performances sont très importants.

Des questions similaires sont:

Cross-platform alternative to COM - celui-ci est proche, mais nous voulons seulement en cours - pas besoin de processus et nos besoins sont un peu « poids léger ».

C++ Cross Platform Dynamic Libraries; Linux and Windows

Ceci est pour C++ non géré - nous ne pouvons pas utiliser .NET

EDIT - ce que nous avons trouvé

Nous avons constaté que Poco fonctionne très bien pour nos besoins. En guise de bonus, This page est un commentaire très apprécié sur l'état du développement C++ et la direction du langage ...

Il s'agissait d'un simple emballage multi-plateforme dont Poco avait besoin. Vraiment, il n'y a pas grand-chose, mais cela nous fait gagner du temps et des tests. Pas de surcharge supplémentaire pendant l'exécution.

+1

Je ne pense pas que quelqu'un a pris la peine de le faire explicitement en cours. XPCOM est la meilleure chose qui me vient à l'esprit. –

+0

poco semble faire l'affaire – Tim

+0

@Tim: Mon commentaire est plutôt lié à l'idée de _un plug-in "architecture" pour permettre aux consommateurs de l'application de fournir leurs propres algorithmes propriétaires._ Mon projet vise la même fonctionnalité, mais nous Si le code utilisateur passe par une boucle infinie, le thread sur lequel le code utilisé s'exécute bloque un des noyaux du processeur, ce qui réduit les performances. Certains comment ce fil doit être arrêté. Avez-vous le même problème? Si oui, quelle est votre solution? –

Répondre

4

La bibliothèque ACE contient des wrappers pour le chargement de bibliothèque dynamique fonctionnant sur plusieurs plates-formes. Si vous voulez plus de confort que la bibliothèque de charge simple, regardez TAO L'ACE ORB. Utiliser corba avec TAO est extrêmement performant et bat probablement toute infrastructure de plugin self-crafted, surtout si vous utilisez dans les appels de processus, comme TAO les optimise.

Pour utiliser l'encapsuleur multi-plateforme de bibliothèque dynamique, utilisez ACE_DLL. Il fournit le wrapper cross-platform le plus basique autour de loadlibrary() que vous avez mentionné.

Entre l'utilisation de ACE_DLL et l'utilisation de TAO, service configuration framework d'ACE vous permet de charger dynamiquement des objets. Après le chargement, vous pouvez obtenir un pointeur sur l'objet chargé que vous avez implémenté et appeler n'importe quelle méthode sur l'objet chargé.

Le code à faire ressemblerait à ceci:

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 est expliqué que TAO connaît deux types d'optimisation de la colocalisation (thru_poa et direct):

Lorsque vous utilisez la stratégie directe, Les invocations de méthode sur des objets colocalisés deviennent des appels directs vers le serviteur sans vérifier le statut du POA.

Vous pourriez être surpris de l'efficacité du TAO s'il est utilisé correctement. Je suggère de créer une preuve de concept simple et de faire des mesures.

+0

Je suis familier avec ACE - je n'ai pas besoin du cross-process «lourd» ou des liaisons transversales. Je ne peux pas imaginer qu'ACE soit proche de la performance d'un appel virtuel. Quel est le coût d'un appel ACE? – Tim

+1

Si vous utilisez la classe ACE_DLL, il n'y a aucun appel de processus croisé. Peut-être que vous n'êtes pas assez familier avec ACE? Même avec TAO, vous pouvez générer un mappage «direct» qui ne fait essentiellement qu'un appel virtuel lorsque l'objet appelé est dans le même processus. – lothar

+0

+1 Oui, j'avais utilisé ACE comme une implémentation corba - pas ace_dll - merci pour la suggestion – Tim