代码之家  ›  专栏  ›  技术社区  ›  Khaled Alshaya

插件背后的基本思想是什么?[关闭]

  •  6
  • Khaled Alshaya  · 技术社区  · 15 年前

    你管它叫什么 加数 , 插件 以后与原始软件连接的额外代码 真的没关系。我很想了解他们是如何工作的,必须有一个简单的解释如何设计一个插件系统。不幸的是,我从来没有理解过它,而且在我的头脑中仍然有许多悬而未决的问题。例如,程序如何找到插件?它是如何与之交互的?什么时候软件最好有插件系统?


    感谢您提供所有有用的答案。看来我问的问题太开放了,幸运的是我有关键词要找。我喜欢 David 虽然我不是爪哇人,但他的话对我来说是有意义的:

    8 回复  |  直到 12 年前
        1
  •  6
  •   David Koelle    15 年前

    插件通过遵循主应用程序期望使用的已知接口来工作。

    插件架构实际工作的方式有几种,但一般来说,这些步骤如下:

    1. 插件设计为与 界面 应用程序期望的。例如,一个简单的应用程序可能需要插件实现 插件接口 接口。
    2. 插件由应用程序加载,通常在应用程序启动时加载。
    3. 插件通常提供对应用程序管理的大部分数据的访问。例如,火狐插件可以访问当前网页,Eclipse插件可以访问打开的文件。

    以下是应用程序查找插件的两种方法(几种方法中的一种):

    1. 插件已知存在于特定文件夹中,应用程序知道从该文件夹加载插件。
    2. 每个插件都作为一个服务运行,并且服务被设计为协同工作(这就是基于OSGi的应用程序的工作方式)

    当找到插件时,它们由应用程序加载(有时是 类加载器 )

    当软件架构师期望软件提供者或用户社区实现最初不是系统一部分的新功能时,他们可以设计一个插件架构。两个很好的例子是Eclipse和Firefox;其他应用程序包括Adobe Photoshop(用于艺术技术和图形工具)和Winamp(用于可视化)。

        2
  •  7
  •   Mitch Wheat    15 年前
    1. 创建 interface 特定类型的所有插件都将实现
    2. 只针对接口编写“使用”插件的代码。
    3. 以动态方式加载包含实现接口的插件类型的dll(例如,具有可配置的文件夹位置,以测试该文件夹中的任何dll是否包含实现接口的任何类型,并动态加载执行接口的任何类型)。在.NET中,这可能会使用 Assembly.LoadFile() )

    如果您想了解一些源代码, Paint.NET 是免费的,开源的,有一个插件架构。

        3
  •  1
  •   Beep beep    15 年前

    程序通常必须设计为寻找插件,插件必须有一个标准的访问点来接受来自主程序的控制。每一个应用程序或网站都有一些不同。

    最简单的插件类型是这样访问的:

    if (a plug-in exists/is configured)
      call predefined plug-in code
    

    在这种情况下,主程序被编码为只处理一组特定的插件(许多基于PHP的WordPress模板都是这样)。稍微高级一点的插件

    perform application specific logic
    if any plug-in exists that exposes the run_after_app_specific_logic function
      call plug-in code
    

    第二种情况可以处理非常复杂的插件…插件只需要实现主程序调用的更多函数。

        4
  •  1
  •   JesperE    15 年前

    Eclipse在应用程序框架的示例中 完全地 基于插件,这意味着所有功能都作为插件实现。在底层有一个用于启动/关闭和插件管理的薄层,但除此之外的一切都是作为插件实现的。这就产生了一个框架,可以用于几乎所有事情。有关Eclipse插件体系结构的更多信息,请参见: http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html .

        5
  •  1
  •   Bill K    15 年前

    它依赖于语言。

    在解释语言中,它只涉及调用遵循模式的文件。

    在C语言中,没有帮助是很难做到的。在C+Windows中,一个“dll”可以是一个插件,通常是这样使用的。

    在具有反射的OO语言中,您可以创建一个实现接口的对象并反射地加载它。加载后,可以忽略它是一个插件的事实,因为它在代码中被视为任何其他对象。

    .NET有一个插件架构(它是COM吗?)好吧,无论如何,COM可以用作(是?)插件系统。

    由于各种可能性,你的问题可能过于开放。没有单一的答案。

        6
  •  1
  •   Slapout    15 年前

    我从来没有写过插件系统。但这就是我脑海中的想象:

    • 您的程序有一个插件子目录(例如“C:\Program Files\My Program Name\Plugins”)。
    • 将插件创建为dll文件,并将它们放在插件文件夹中。
    • 这些DLL将导出具有预定义名称的函数。
    • 当你运行你的程序时,它会查看你插件文件夹中的所有DLL。在每一个函数中,它都会查找具有特定名称(例如“load”)的导出函数并调用该函数。然后,该插件可以执行它需要执行的任何设置。
    • 然后,该程序将调用插件上名为“getPluginName”的导出函数。插件将返回它的名称,然后当它向用户显示插件列表时,程序可以使用该名称。
    • 当调用插件时,程序会调用另一个导出的函数(可能是“activate”),并可能将一个指针传递给插件将要处理的数据。然后程序将对数据进行处理。
    • 该插件还可以导出程序调用的另一个函数,以显示一个设置对话框,您可以在其中更改插件选项。
        7
  •  0
  •   Nick Bedford    15 年前

    插件系统可以以多种方式实现,但是很多C/C++应用程序的通用方式是基于DLL的插件SDK。

    DLL将公开各种自动函数调用,这些调用可能允许插件在正在运行的应用程序中“自行设置”,例如添加菜单项、新功能或系统的额外选项(如3D渲染实现)。

        8
  •  0
  •   Bostone    15 年前

    更重要的是,不需要任何特殊的发现——插件机制通常是愚蠢的:这是我理解的代码签名,这是我可以做的调用。我不知道我打电话的事情会如何完成这项工作,但我希望结果是某种形式的。这几乎是一份合同。现在-插件将实现合同并使自己可用。在Java中,例如“使可用”仅仅意味着实现类被加载到内存中。特定数据库的JDBC驱动程序就是一个很好的例子。