【问题标题】:How to correctly expose API in a plugin system?如何在插件系统中正确公开 API?
【发布时间】:2015-09-18 12:11:50
【问题描述】:

在下面的类图中,您可以看到我当前的插件/扩展系统方法。我想为通用/全局事物提供扩展 API。但是公开的 API 应该只包含被引用对象的实际功能的一个子集。我的第一个想法是使用接口。这样做的问题是,一个邪恶的插件可能会将接口向下转换为内部类并把事情搞砸。 (我应该关心吗?)第二个想法是使用代理模式。目前我同时使用它们。我想这不是真的必要。但是考虑到二进制兼容性如何降低这里的复杂性?

【问题讨论】:

  • 顺便说一句,你用什么程序来制作 UML?
  • 这是针对开源项目,还是针对仅以二进制形式分发插件的闭源、仅二进制项目?如果是后者,那么“邪恶插件”需要进行一些严格的逆向工程,以便能够向下转换您传递给插件的对象指针。如果它是一个开源项目,那么你真的无能为力。 :)
  • @PaoloM UMLet。这是开源的。
  • 与您的代码在同一内存空间中运行的恶意代码可以做任何事情,C++ 中没有针对它的保护。使用不需要的代理(恶意代码仍然可以获取指向真实对象的指针)只会使您的设计复杂化并使其更加脆弱。

标签: c++ qt api plugins proxy-pattern


【解决方案1】:

如果您想要的插件不会以某种方式破坏您的程序,那么您必须将这些插件作为单独的进程。然后插件在单独的内存空间中运行,并通过管道或套接字与您的应用程序通信。

【讨论】:

    【解决方案2】:

    我应该关心吗?

    没有。 C++ 的功能是帮助您编写正确的软件,而不是保护您免受恶意开发人员的侵害。这不是语言的工作。您的 API 的设计应确保正确性、全面性和易用性。

    考虑到二进制兼容性如何降低这里的复杂性?

    创建不从任何东西继承的 API 类。查看Leap Motion C++ API 以获得如何正确执行此操作的灵感。

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多