Plugins 插件/运行时扩展架构

Plugins 插件/运行时扩展架构,plugins,runtime,Plugins,Runtime,对于语言来说,通过用户给定的模块/库/代码进行插件或扩展运行时代码的一些常见方法是什么。。。??我在考虑C/C++但其他语言如何做到这一点也可能适用 是一个广泛使用的Java组件框架,是该框架的基础,该框架也涉及可插拔UI。一种方法是将模块编译成动态对象,主程序使用dlopen打开该对象。然后,它使用dlsym查找模块必须定义的特定初始化函数,并调用该函数。例如,您可能会说存储在foo.so中的模块必须定义一个名为module\u foo\u init的函数 然后,模块的init例程通常会调用主

对于语言来说,通过用户给定的模块/库/代码进行插件或扩展运行时代码的一些常见方法是什么。。。??我在考虑C/C++但其他语言如何做到这一点也可能适用

是一个广泛使用的Java组件框架,是该框架的基础,该框架也涉及可插拔UI。

一种方法是将模块编译成动态对象,主程序使用dlopen打开该对象。然后,它使用dlsym查找模块必须定义的特定初始化函数,并调用该函数。例如,您可能会说存储在foo.so中的模块必须定义一个名为module\u foo\u init的函数


然后,模块的init例程通常会调用主程序提供的函数来注册某些事件或挂钩的处理程序。

在我使用过的大多数语言中,这样做的一般方法是:

您有两个二进制文件、主程序和一个插件接口库。 插件接口库基本上只包含接口或抽象基类,或者插件可以编码和扩展的类似内容。 主程序使用反射或其他标准化接口从所有插件库中提取实现该接口的类的实例。对所有插件重复此步骤 然后,只要需要与插件交互,就会对接口进行调用。 设计最后一部分是大部分工作的重点。什么调用或钩子,或者什么应该被允许?这些函数是如何注册的,它们只是函数,可能是空的,还是会有某种钩子注册?如果是后者,我通常将一个对象传递到可用于注册钩子的构造函数中,这将如何工作