Plugins 惯用生锈插件系统
我想外包一些插件系统的代码。在我的项目中,我有一个叫做Plugins 惯用生锈插件系统,plugins,rust,Plugins,Rust,我想外包一些插件系统的代码。在我的项目中,我有一个叫做Provider的特性,它是我的插件系统的代码。如果你激活“消费者”功能,你可以使用插件;如果你没有,你就是插件的作者 我希望插件的作者通过编译到一个共享库,将他们的代码输入到我的程序中。共享库是一个好的设计决策吗?插件的局限性是无论如何都要使用Rust 插件主机加载共享库是否必须采用C方式:加载非混合函数 我只想让作者使用trait提供者来实现他们的插件,就这样。 在查看和之后,似乎不可能以惯用的方式加载插件 我只想将trait对象加载到我
Provider
的特性,它是我的插件系统的代码。如果你激活“消费者”功能,你可以使用插件;如果你没有,你就是插件的作者
我希望插件的作者通过编译到一个共享库,将他们的代码输入到我的程序中。共享库是一个好的设计决策吗?插件的局限性是无论如何都要使用Rust
插件主机加载共享库是否必须采用C方式:加载非混合函数
我只想让作者使用trait提供者
来实现他们的插件,就这样。
在查看和之后,似乎不可能以惯用的方式加载插件
我只想将trait对象加载到我的ProviderLoader
:
// lib.rs
pub struct Sample { ... }
pub trait Provider {
fn get_sample(&self) -> Sample;
}
pub struct ProviderLoader {
plugins: Vec<Box<Provider>>
}
如果插件被编译成共享libs,这是可能的吗?这也会影响插件板条箱类型的决定
你还有其他想法吗?也许我走错了路,所以共享lib不是圣杯
我第一次把这个贴在网上。一位朋友建议我尝试一下堆栈溢出。没有正式的插件系统,你不能在运行时用纯Rust加载插件。我看到了一些关于做一个本地插件系统的讨论,但是现在还没有决定,也许永远不会有这样的事情。您可以使用以下解决方案之一:
no_mangle
属性,extern
等。您可以通过在Internet上搜索Rust FFI来查找更多信息。在这个解决方案中,您必须使用原始指针:它们没有安全保证(即,您必须使用不安全的代码)
当然,您可以用Rust编写动态库,但是要加载它并调用函数,您必须通过C ABI。这意味着生锈的安全保证不适用于该区域。此外,不能在库和二进制文件之间使用Rust的最高级别功能,如trait
、enum
等- ,一种类似Haskell的函数式语言
- ,一种小型但功能强大的脚本语言,用于视频游戏
- 卢阿与奥特
stable-x86\u 64-pc-Windows-msvc
)和Cent OS 7(stable-x86\u 64-unknown-linux-gnu
)上的调试和发布配置中,在Rust 1.20 stable上对其进行了个人测试
方法
我采取的方法是共享common
板条箱,这两个板条箱都列为定义commonstruct
和trait
定义的依赖项。起初,我还打算测试两个库中独立定义的具有相同结构或相同定义的trait的结构,但我选择了它,因为它太脆弱,您不希望在实际设计中使用它。也就是说,如果有人想测试这个,可以在上面的存储库上随意做一个PR,我会更新这个答案
此外,Rust插件被声明为dylib
。我不确定编译为cdylib
时会如何交互,因为我认为这意味着加载插件时会有两个版本的Rust标准库(因为我相信cdylib
静态地将Rust stdlib链接到共享对象)
测验
一般说明
- 我测试的结构没有声明为
。这可以通过保证布局提供额外的一层安全性,但我最感兴趣的是编写“纯”的锈菌插件,尽可能少地“像C一样处理锈菌”。我们已经知道你可以通过FFI使用Rust,方法是用不透明的指针包装东西,手动放置,等等,所以测试这一点不是很有启发性#repr(C)
- 我使用的函数签名是
和pub fn foo(args)->output
指令,结果是[no#mangle]
自动将rustfmt
更改为外部“Rust”fn