2 个稳定版本
1.0.1 | 2023 年 3 月 23 日 |
---|
#138 in #load
每月下载量:24
5KB
71 行
用法
在不同 crate 中使用 plugin_trait!
和 plugin_implementation!
。
使用 plugin_trait!
宏封装插件 trait。将生成一个 load_plugin
函数。它可以从一个静态库中加载插件对象。
使用 plugin_implementation!
宏封装插件实现。将生成一个 get_interface
函数。将 crate 编译为静态库以使用插件。
安全性
load_plugin
是不安全的,因为您应该传递正确的(匹配的)插件 trait 作为其第一个参数,否则将发生未定义的行为。这是因为无法确定静态库中接口获取器的返回值类型。
示例
app/src/main.rs
:
fn main() {
let plugin = unsafe { app::load_plugin("plugins/libplugin1.so") }.unwrap();
plugin.print("hello");
}
app/src/lib.rs
:
pub trait Plugin: Sync + Send {
fn print(&self, message: &str);
}
pluginator::plugin_trait!(Plugin);
plugin1/src/lib.rs
:
struct Plugin;
impl app::Plugin for Plugin {
fn print(&self, message: &str) {
println!("{}", message);
}
}
pluginator::plugin_implementation!(app::Plugin, Plugin);
依赖关系
~92–260KB