9

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

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

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

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

我认为这实际上只是围绕 loadlibrary() 和导出的方法调用。我们可以自己编写,但我们宁愿使用现有的代码,因为我们的盘子已经足够了。

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

类似的问题是:

COM 的跨平台替代方案- 这个很接近,但我们只需要进程内 - 不需要进程外,我们的需求是“更轻一些”。

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

这适用于非托管 C++ - 我们不能使用 .NET

编辑 - 我们发现了什么

我们发现Poco非常适合我们的需求。作为奖励,此页面非常感谢您对 C++ 开发状态和语言方向的评论...

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

4

2 回答 2

4

ACE库包含用于跨平台工作的动态库加载的包装器。如果您想要比普通加载库更舒适,请查看TAO The ACE ORB。将 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):

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

如果使用得当,您可能会惊讶于 TAO 的有效性。我建议创建一个简单的概念证明并进行测量。

于 2009-12-07T12:53:18.943 回答
3

我认为这也可能有效:http: //pocoproject.org/docs/Poco.SharedLibrary.html

于 2009-12-08T16:45:32.477 回答