针对跨平台进程内动态库绑定(即轻量级,高性能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提供。真的没有多少,但仍然节省了我们的时间和测试。运行时无额外开销。
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效果如何。我建议创建一个简单的概念证明和测量。
,我不认为任何人打扰的进程明确地做到这一点。 XPCOM是最好的想法。 – 2009-12-06 13:00:44
poco似乎要诀窍 – Tim 2009-12-10 06:16:11
@Tim:我的评论与_a插件“体系结构”的概念相关,以允许应用程序的消费者提供他们自己的专有算法。因此,我的项目旨在实现相同的功能,但我们有一个严重的问题,即如果用户代码经历了一个无限循环,那么使用代码运行的线程会锁定CPU的一个内核,从而降低性能。一些如何这个线程必须停止。那么你有同样的问题吗?如果是的话,你的解决方案是什么? – 2011-10-04 11:33:40