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

StackOverflow https://stackoverflow.com/questions/1854323

我们正在开发一个应用程序,该应用程序将具有插件“架构”,以允许应用程序的消费者提供自己的专有算法。(我们基本上会有一套解析器,并允许第三方提供自己的解析器)

域空间需要非常高的性能,因此进程外绑定不起作用,我们宁愿不去理会 CORBA 和 COM 等重量级的东西。

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

  • 从相对路径加载库
  • 提供特定 dll/.so 到某些配置/名称的映射
  • 进行一些初始化并查询库以确保它提供必要的功能

我认为这实际上只是对 loadlibrary() 和导出的方法调用的包装。我们可以自己编写这个代码,但我们宁愿使用现有的代码,因为我们手头有足够的代码。

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

类似的问题还有:

COM 的跨平台替代方案 - 这个已经很接近了,但我们只需要进程内的 - 不需要进程外的,而且我们的需求是“更轻的重量”。

C++跨平台动态库;Linux 和 Windows

这是针对非托管 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 的有效性。我建议创建一个简单的概念证明并进行测量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top