针对跨平台进程内动态库绑定的 C++ 包装器的建议(即轻量级、高性能 COM 或 CORBA)[关闭]
-
13-09-2019 - |
题
我们正在开发一个应用程序,该应用程序将具有插件“架构”,以允许应用程序的消费者提供自己的专有算法。(我们基本上会有一套解析器,并允许第三方提供自己的解析器)
域空间需要非常高的性能,因此进程外绑定不起作用,我们宁愿不去理会 CORBA 和 COM 等重量级的东西。
基本上我们正在寻找一个简单的跨平台包装器:
- 从相对路径加载库
- 提供特定 dll/.so 到某些配置/名称的映射
- 进行一些初始化并查询库以确保它提供必要的功能
我认为这实际上只是对 loadlibrary() 和导出的方法调用的包装。我们可以自己编写这个代码,但我们宁愿使用现有的代码,因为我们手头有足够的代码。
同样,吞吐量和性能非常非常重要。
类似的问题还有:
COM 的跨平台替代方案 - 这个已经很接近了,但我们只需要进程内的 - 不需要进程外的,而且我们的需求是“更轻的重量”。
这是针对非托管 C++ - 我们不能使用 .NET
编辑-我们发现了什么
我们发现 波科 非常适合我们的需求。作为奖励 这一页 是对 C++ 开发状况和语言方向的高度赞赏的评论......
Poco 提供了我们需要的简单跨平台包装。实际上没有太多内容,但仍然节省了我们的时间和测试。运行时没有额外的开销。
解决方案 2
其他提示
这 高手 库包含用于跨平台工作的动态库加载的包装器。如果您想要比普通加载库更舒适,那么看看 陶氏 王牌球体。将 corba 与 TAO 结合使用具有极高的性能,并且很可能胜过任何自制的插件基础架构,特别是如果您在进程调用中使用,因为 TAO 会优化它们。
使用动态库跨平台包装器使用 ACE_DLL. 。它提供了您提到的 loadlibrary() 的最基本的跨平台包装器。
在使用 ACE_DLL 和使用 TAO 之间是 服务配置框架 ACE 允许您动态加载对象。加载后,您可以获得指向您实现的加载对象的向上转换指针,并且可以调用加载对象上的任何方法。
执行此操作的代码如下所示:
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();
这里 解释说 TAO 知道两种类型的托管优化(thru_poa 和 direct):
当使用直接策略时,对并置对象的方法调用变成对servant的直接调用,而不检查POA的状态。
如果使用得当,您可能会惊讶 TAO 的有效性。我建议创建一个简单的概念证明并进行测量。