针对跨平台进程内动态库绑定(即轻量级,高性能COM或CORBA)的C++包装的建议

问题描述:

我们正在开发一个应用程序,该应用程序将具有一个插件“体系结构”,以允许应用程序的消费者提供他们自己的专有算法。 (我们基本上有一套解析器,并允许第三方提供自己的解析器)针对跨平台进程内动态库绑定(即轻量级,高性能COM或CORBA)的C++包装的建议

域空间需要非常高的性能,所以进程外绑定不起作用,我们宁愿离开像CORBA和COM这样的重量级的东西。

基本上我们正在寻找一个简单的跨平台的包装器:

  • 负载库从一个相对路径
  • 一些配置/名称提供特定的DLL的映射/。所以
  • 做一些初始化和查询库,以确保它提供必要的功能

我认为这实际上只是一个包裹loadlibrary()和方法调用出口。我们可以自己写这个,但是我们宁愿使用现有的代码,因为我们已经足够了。

同样,吞吐量和性能非常重要。

类似的问题:

Cross-platform alternative to COM - 这一个是接近的,但我们希望在过程只 - 无需进行过程中,我们的需求是有点“重量更轻”。

C++ Cross Platform Dynamic Libraries; Linux and Windows

这是托管C++ - 我们不能使用.NET

编辑 - 我们发现

我们发现Poco我们需要的伟大工程。作为奖励This page是一个非常赞赏的评论C++的发展状态和语言的方向......

这是一个简单的跨平台包装,我们需要Poco提供。真的没有多少,但仍然节省了我们的时间和测试。运行时无额外开销。

+1

,我不认为任何人打扰的进程明确地做到这一点。 XPCOM是最好的想法。 – 2009-12-06 13:00:44

+0

poco似乎要诀窍 – Tim 2009-12-10 06:16:11

+0

@Tim:我的评论与_a插件“体系结构”的概念相关,以允许应用程序的消费者提供他们自己的专有算法。因此,我的项目旨在实现相同的功能,但我们有一个严重的问题,即如果用户代码经历了一个无限循环,那么使用代码运行的线程会锁定CPU的一个内核,从而降低性能。一些如何这个线程必须停止。那么你有同样的问题吗?如果是的话,你的解决方案是什么? – 2011-10-04 11:33:40

ACE库包含用于跨平台工作的动态库加载的包装。 如果你想比普通loadlibrary更舒适,那么看看TAO ACE ORB。与TAO一起使用corba具有极高的性能,并且最有可能击败任何自制的插件基础架构,尤其是当您在进程调用中使用时,就像TAO优化它们一样。

要使用动态库跨平台包装使用ACE_DLL。它提供了你提到的loadlibrary()最基本的跨平台包装。

在使用ACE_DLL和使用TAO之间的是ACE的service configuration framework,允许您动态加载对象。加载后,您可以获得一个上传指针,指向您实施的加载对象,并可以调用加载对象上的任何方法。

这样做,看起来像这样的代码:

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解释了TAO知道两种类型的托管优化(thru_poa和直接):

当使用直接的策略,并置对象的方法调用变成直接调用servant而不检查POA的状态。

如果使用正确,您可能会惊讶TAO效果如何。我建议创建一个简单的概念证明和测量。

+0

我对ACE很熟悉 - 虽然我不需要“重量级”跨进程或跨机器绑定。我无法想象ACE能够接近一个虚拟呼叫的表现。 ACE呼叫的开销是多少? – Tim 2009-12-07 13:54:49

+1

如果您使用ACE_DLL类,则根本没有跨进程调用。也许你对ACE不够熟悉?即使使用TAO,您也可以生成一个'直接'映射,当被调用对象处于同一进程时,该映射基本上只会进行虚拟调用。 – lothar 2009-12-07 15:39:56

+0

+1是的,我用ACE作为corba实现 - 不是ace_dll - 谢谢 – Tim 2009-12-08 16:43:48