插件背后的基本理念是什么?

时间:2009-09-21 04:16:50

标签: plugins

您可以将其称为插件插件 以后与原始软件连接的额外代码 ,真的没关系。我很想了解它们是如何工作的,必须对如何设计插件系统进行简单的解释。不幸的是,我从来没有理解过,在我的脑海里仍然存在许多悬而未决的问题。例如,程序如何找到插件?它是如何与它接口的?什么时候软件最好有插件系统?


感谢所有有用的答案。看来我问过于开放的问题,幸运的是我找到了关键词。我喜欢David回答虽然我不是Java人,但他的谈话对我来说很有意义:))

8 个答案:

答案 0 :(得分:7)

  1. 创建interface特定类型的所有插件将实现
  2. 仅针对界面编写将“使用”插件的代码。
  3. 以动态方式加载包含实现接口的插件类型的DLL(例如,有一个可配置的文件夹位置来测试该文件夹中的任何DLL是否包含实现您的接口的任何类型,并动态加载任何在.NET中,这可能会使用Assembly.LoadFile()
  4. 如果你想查看一些源代码,Paint.NET是免费的开源代码,并且有一个插件架构。

答案 1 :(得分:6)

插件的工作方式是遵循主应用程序期望使用的众所周知的接口。

插件架构实际上有多种工作方式,但总的来说,这些步骤是:

  1. 插件旨在匹配应用程序所需的接口。例如,一个简单的应用程序可能要求插件实现 IPlugin 接口。
  2. 插件由应用程序加载,通常是在应用程序启动时
  3. 通常可以通过插件访问应用程序管理的大部分数据。例如,Firefox插件可以访问当前的网页,Eclipse插件可以访问打开的文件。
  4. 以下是应用程序可以找到插件的两种方式(多种方式):

    1. 已知插件存在于特定文件夹中,并且应用程序知道从该文件夹加载插件
    2. 每个插件作为服务运行,服务设计为协同工作(这是基于OSGi的应用程序的工作方式)
    3. 当找到插件时,应用程序会加载它们(有时是类加载器的作业)。

      软件架构师可能会设计插件架构,因为他们希望软件提供商或用户社区能够实现原本不属于系统的新功能。两个很好的例子是Eclipse和Firefox;其他应用程序包括Adobe Photoshop(用于艺术技术和图形工具)和Winamp(用于可视化)。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

Eclipse是一个应用程序框架示例,它基于完全基于插件,这意味着所有功能都是作为插件实现的。底部有一个薄层用于启动/关闭和插件管理,但其他所有内容都是作为插件实现的。这导致了一个可以用于几乎所有事情的框架。有关Eclipse插件架构的更多信息,请访问:http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html

答案 4 :(得分:1)

它非常依赖语言。

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

在C中,没有帮助就很难做到。在C +窗口中,“DLL”可以是插件,并且通常以这种方式使用。

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

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

由于所有可能性,你的问题可能过于开放。没有一个答案。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

更多的是没有任何特殊的发现 - 插件机制通常是愚蠢的:这是我理解的代码签名,这是我可以做的一个电话。我不知道我打电话的是怎么做的,但我希望结果是某种格式。这几乎是一份合同。现在 - 该插件将实现合同并使其自身可用。在Java中,例如“make available”只是意味着实现类被加载到内存中。特定数据库的JDBC驱动程序就是一个很好的例子。