由于所建议的dynamic_reload
板条箱的例子,我收集Symbol
s,而不是每次都提取它们,但Symbol
需要一辈子.使用生命周期更改方法签名并破坏与方法的兼容性DynamicReload::update
.
用它std::mem::transmute
来改变Symbol
生命周期是一种有效的解决方法'static
吗?
extern crate dynamic_reload;
use dynamic_reload::{DynamicReload, Lib, Symbol, Search, PlatformName, UpdateState};
use std::sync::Arc;
use std::time::Duration;
use std::thread;
use std::mem::transmute;
struct Plugins {
plugins: Vec<(Arc<Lib>, Arc<Symbol<'static, extern "C" fn() -> i32>>)>,
}
impl Plugins {
fn add_plugin(&mut self, plugin: &Arc<Lib>) {
match unsafe { plugin.lib.get(b"shared_fun\0") } {
Ok(temp) => {
let f: Symbol<extern "C" fn() -> i32> = temp;
self.plugins.push((plugin.clone(), Arc::new(unsafe { transmute(f) }))); …
Run Code Online (Sandbox Code Playgroud)