-
Notifications
You must be signed in to change notification settings - Fork 23
DevPlugin
插件是主程序调度的单元,插件是直接被程序初始化的类,插件通过放置在程序的 Plugins\ 文件夹下被程序所示别并加载进当前程序实例的Assemblies中。
插件通过继承Plugin类实现,程序会根据类签名对在Plugins文件夹中的所有dll文件进行加载,但是只会对继承了Plugin类的类进行初始化。
Plugin类成员及其成员函数
类别 | 成员名称 | 类型 | 说明 |
---|---|---|---|
public readonly | Name | String | 插件名称 |
public readonly | Author | String | 插件作者 |
public | EventBus | BaseEventDispatcher<IPluginEvent> | 插件的事件绑定、触发器 |
标识 | 函数签名 | 返回类型 | 说明 |
---|---|---|---|
public | Plugin(string Name, string Author) | .ctor() | 构造函数 |
protected | getHoster() | SyncHost | 获得当前程序实例的SyncHost类 |
public | getName() | string | 获得插件名称(旧代码兼容) |
public | getAuthor() | string | 获得插件作者(旧代码兼容) |
public virtual | OnDisable() | void | 当插件需要执行禁用操作时,被调用的函数 |
public virtual | OnEnable() | void | 当插件被程序识别并进行初始化时所调用的函数 |
当插件初始化完成之后,全局已加载插件 将会触发此事件(未加载的插件不会触发和响应这个事件)。
成员 | 说明 |
---|---|
Plugin | 正在准备初始化的插件 |
当程序准备Source(弹幕源)列表时,将SourceManager暴露给事件接收者,接收者可在此添加Source的实例。
成员 | 说明 |
---|---|
Sources | 直播源列表及实例 |
当程序准备消息Filter时,将FilterManager暴露给事件接收者,接收者可在此添加Filter的实例。
成员 | 说明 |
---|---|
Filters | Filter列表及实例 |
当程序准备命令列表时,将CommandManager暴露给事件接收者,接收者可在此为程序添加一系列命令。
成员 | 说明 |
---|---|
Commands | 命令实例及列表 |
当程序准备游戏源实例时,将ClientManager暴露给时间接收者,接收者可在此添加游戏源的实例。
成员 | 说明 |
---|---|
Clients | 游戏源实例列表 |
当程序决策好当前游戏源实例时(游戏源实例是可以切换的,切换也会触发此事件),触发此事件。
成员 | 说明 |
---|---|
ClientWorkWrapper | 游戏源的外覆类 |
当程序基本的加载完成时,触发此事件
成员 | 说明 |
---|---|
Host | 管理程序的初始化类 |
当程序全部加载完成、并等待用户开始同步命令时触发的函数
当插件出现依赖问题时,就需要使用插件的Attribute进行解决以来,典型问题是插件A 依赖插件B,但是程序的调度是根据文件名的先后顺序来决定加载次序的。如果插件A先于插件B加载,则插件A会丢失或无法访问插件B的实例或者是相关资源。此时需要在插件A的实现上添加一个Attribute,让程序在插件B加载之后再进行插件A的加载操作。
依赖被分为两种情况,硬依赖和软依赖。
硬依赖用于 在加载插件之前,必须将依赖的插件初始化,否则报错 的情况,也就是必须安装了目标插件,才能继续加载。
软依赖用于 声明式的让程序先加载目标插件,如果目标插件不存在,则继续加载。 在安装了目标插件的情况下,程序会先调用目标插件进行加载操作,如果没有安装目标插件,程序则会按正常顺序加载插件。
[SyncRequirePlugin(typeof(DefaultPlugin.DefaultPlugin))]
//DefaultPlugin这个插件进行硬依赖,必须有这个插件!
public class DefaultGUI : Plugin
{
//Implements....
}
[SyncSoftRequirePlugin("DefaultPlugin")]
//对DefaultPlugin这个插件进行软依赖,没有DefaultPlugin这个插件也行!
public class PPQuery : Plugin
{
//Implements...
}
程序的加载次序如下
弹幕源 -> 选择弹幕源 -> 游戏源 -> 选择游戏源 -> 插件命令 -> Filter(消息过滤器)
在如下情况,程序会直接停止工作
- 无法选择合适的弹幕源
- 无法选择合适的游戏源
- 任一插件在处理加载事件时抛出任何错误