4 个版本
0.2.0 | 2020年7月5日 |
---|---|
0.1.2 | 2020年7月4日 |
0.1.1 | 2020年7月4日 |
0.1.0 | 2020年7月4日 |
#28 在 #plugin-system
14KB
183 行
面向消息传递的插件架构
即使将插件限制在 Rust 中,插件也可能很复杂,通常需要大量工作来确保它们是内存安全的,API的可选部分不会破坏宿主,当然,类型可以自由地跨越 FFI 接口,因为 Rust 还没有稳定的 ABI。
该 crate 旨在为 Rust 插件和宿主之间提供一个简单的桥梁:使用 Rust 编写您的插件,确保它实现了 Plugin<T>
(只有一个方法需要实现 :D),并构建一个包含单个必需函数的 dll:一个构造函数,它将您的插件存储到一个指针中。
此插件架构基于消息传递:宿主将您的消息的计数引用发送给每个插件。
为什么有 tokio-host
功能?
tokio-host
功能允许您选择一个依赖于 tokio
的运行时和通道的宿主,而不是 std
的线程和通道。选择最适合您应用程序的选项,但请记住,tokio-host
的 API 中的某些部分是异步函数而不是普通函数,您需要使用 .await
才能使其生效。
这个库的内存安全性如何?
非常安全:消息传递队列通常是您通过方法调用来做的,确保您的插件只按顺序被宿主调用:您可以自由地修改状态,只要您在插件中不要有并发。
同时,消息通过不可变的计数引用传递:除非您打破常规规则,否则即使有多个插件同时运行,您也无法破坏自己的消息。
等等,消息是不可变引用,而 handle_message
只返回 Option<u8>
... 我如何将数据发送回我的宿主应用程序?
为此,您需要为您的插件提供一个它们可以使用来发送数据的通道。您可以选择任何通道,但我建议使用 std::sync::mpsc::sync_channel
这个库与其它编程语言兼容吗?
老实说,并非如此:当前用于动态加载插件的接口是一个 Box<dyn Plugin<T>>
,您需要在自己的替代语言中模拟此接口,才能开始在其他语言中制作插件...
如果您想与其他语言兼容,可能需要构建一个插件,将插件系统与您可能在该语言中开发的插件进行接口。老实说,此时,您可能还不如直接开发自己的插件接口...
依赖项
~0.1–1.4MB
~21K SLoC