2 个稳定版本

1.0.1 2023 年 3 月 23 日

#138 in #load

每月下载量:24

MIT 许可证

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