【问题标题】:what's the best way to write a pluginable application?编写可插件应用程序的最佳方法是什么?
【发布时间】:2011-11-26 06:36:12
【问题描述】:

我想编写一个可以用插件扩展的本机应用程序,最好以动态库的形式。我知道该怎么做,但我想要一些想法,尤其是关于该做什么和不该做什么的最佳实践提示。我在 java 和 php 上使用过类似的东西,所以我希望我不会给我的 C++ 带来任何坏习惯。

我正在考虑允许开发人员实现某些功能,例如“on_recieve_data(App* app, void* data)”,我的应用程序将加载所有插件并使用指向自身的指针调用它们的 on_recieve_data 函数(dlsym?)。

【问题讨论】:

  • 既然你在使用C++,为什么不拥有一个抽象基类,并且在每个模块中都有一个函数返回一个指向该类实例的指针呢?我的意思不是使用普通函数。

标签: c++ plugins


【解决方案1】:

我认为有几件事对于插件来说非常重要:

  • 语言支持

如果您想使用最多的平台/语言/编译器,那么您应该用 C 而不是 C++ 编写插件接口。插件开发者仍然可以用 C++ 编写他们的函数,当然,只是接口是 C。问题是每个 C++ 编译器都以自己的方式破坏符号名称,所以如果你使用 C++,你将迫使插件开发者使用与您相同的编译器和工具。另一方面,只有一种方法可以导出 C 符号,因此为插件使用 C 接口将允许开发人员选择他们喜欢的任何工具,只要他们可以生成标准的 .so/.dll 库,他们就会没事。

  • 内存分配

在某些平台上,当应用程序分配的内存被 DLL 释放时会出现问题,反之亦然。如果插件具有应该分配内存的函数,那么请确保您还要求插件提供相应的函数来释放该内存。同样,如果插件可以调用应用程序中的函数来分配内存,您还应该为该内存公开一个释放函数。

  • 版本控制

在编写插件之后,您可能需要修改插件 API。因此,您的应用程序需要准备好加载为旧版本开发的插件。您应该在应用程序调用的插件中需要一个“init”函数,以确定插件实现的 API 的版本以及应用程序可能需要知道的任何其他信息,例如插件类型(如果有不同的类型),什么是实施和未实施等。

此外,当您必须修改插件 API 时,您必须非常小心。您不能更改现有功能,因为这会破坏旧插件。相反,您将需要添加具有改进功能的替代版本。然后问题来了如何命名现有函数的新版本。通常,它们会得到相同的名称加上一些后缀(“Ex”、数字等)。我还没有看到这个问题以我喜欢的方式解决。

同样,您必须对在应用程序和插件之间传递的结构采取预防措施。一种常见的方法是使所有结构的第一个成员具有结构的大小。这是一种版本控制机制,因此应用程序可以根据其大小确定结构的外观。

以下是一些可能感兴趣的链接:

  • C-Pluff,C 语言的通用插件框架(MIT 许可)
  • lighttpd的plugin.h头文件
  • This page 讨论了如何在 Mac OS X 下实现插件架构,包括对如何为插件创建 C 接口的简短概述。
  • Blender 是一个有趣的。该应用程序是用 C++ 编写的,但插件是用 Python 编写的。这确实不是一个坏主意,它使开发人员更容易编写插件。

有很多用脚本语言编写的应用程序支持插件(Wordpress、Drupal、Django 等等)。您可以查看任何与您正在编写的应用程序类型更接近的应用程序。

【讨论】:

  • 感谢您的建议!我确实在发帖后不久就决定使用 C。我正在研究其他一些可插入的应用程序,即 apache 和 Wordpress(Wordpress 是一个很好的例子吗?)。
  • 网络浏览器是插件信息的良好来源。你可能还想看看 lighttpd,它比 Apache 更小更简单。基于 PHP/Python 的 CMS 也可以是一个很好的创意来源,但请记住,由于其动态特性,脚本语言比 C 具有更大的灵活性,因此您在脚本插件中看到的某些内容将很难在 C 中复制. 我用我发现的一些有趣的链接更新了我的答案。
【解决方案2】:

我相信这篇文章 -> Design Pattern for implementing plugins in your application? 确实回答了我猜的你的问题。它对插件模型有很多参考。

【讨论】:

  • 谢谢,但帖子上的答案似乎是基于 .NET 的。我正在寻找更一般的或至少基于 C 的答案。
【解决方案3】:

也许,Eclipse 架构可以作为示例: http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html

我很高兴 Eclipse 的创建者有一本书,但我既不记得作者也不记得书名。

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 2010-09-23
    • 2011-11-20
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多