在 Rust 开发 DLL 时安全地将对象地址传递给 C 语言并保持对象不被析构,需要正确处理所有权和生命周期。以下是详细方案和代码示例:
核心思路
- 堆分配对象 - 使用
Box在堆上分配对象 - 泄漏所有权 - 使用
Box::into_raw防止 Rust 自动析构 - 明确所有权协议 - 提供销毁函数由 C 语言调用方管理生命周期
- 线程安全 - 使用
Send + Sync确保跨线程安全
完整示例
Rust DLL 实现
// src/lib.rs
use std::sync::Mutex;
#[repr(C)]
pub struct Counter {
value: Mutex<i32>, // 内部可变性保证线程安全
}
impl Counter {
pub fn new(init: i32) -> Self {
Counter {
value: Mutex::new(init),
}
}
pub fn increment(&self) {
let mut lock = self.value.lock().unwrap();
*lock += 1;
}
pub fn get_value(&self) -> i32 {
*self.value.lock().unwrap()
}
}
// 创建对象并返回指针 (所有权转移给调用方)
#[no_mangle]
pub extern "C" fn counter_create(init: i32) -> *mut Counter

最低0.47元/天 解锁文章
240

被折叠的 条评论
为什么被折叠?



