#dll #load #dlopen #shared #so

libloader

基于libloading的简单易用的Rust DLL加载器

5个版本

0.1.4 2022年9月12日
0.1.3 2022年9月12日
0.1.2 2022年9月12日
0.1.1 2022年9月12日
0.1.0 2022年9月12日

#532操作系统

Download history 104/week @ 2024-03-12 55/week @ 2024-03-19 28/week @ 2024-03-26 51/week @ 2024-04-02 83/week @ 2024-04-09 107/week @ 2024-04-16 68/week @ 2024-04-23 54/week @ 2024-04-30 38/week @ 2024-05-07 17/week @ 2024-05-14 33/week @ 2024-05-21 25/week @ 2024-05-28 58/week @ 2024-06-04 91/week @ 2024-06-11 55/week @ 2024-06-18 3/week @ 2024-06-25

212 每月下载量
2 crates 中使用

自定义许可证

445KB

包含 (Mach-o库,440KB) libstd.dylib

libloader

libloader是一个基于libloading的简单易用的Rust DLL加载器

它非常容易动态调用动态链接库(Windows的DLL文件,Unix/Linux的so文件,macOS的dylib文件)中的函数

使用此函数从DLL获取函数

get_libfn!(
    "path.dll",
    "func_name",
    name_to_call,
    return_type, // ifreturn type is none, use "()" instead
    param1_name: param1_type
    param2_name: param2_type
    param3_name: param3_type
    ...
);

例如,我们有以下来自libstd.dylib的函数

// lib.rs (compiled into libstd.dylib)
#[no_mangle]
pub fn println(str: &str) {
    println!("{}", str);
}

#[no_mangle]
pub fn add(a: usize, b: usize) -> usize {
    a + b
}

#[no_mangle]
pub fn print_hello() {
    println!("Hello");
}

我们可以这样调用它

// main.rs
use libloader::libloading
fn main() {
    get_libfn!("libstd.dylib", "println", my_println, (), str: &str);
    my_println("Hello World");

    get_libfn!("libstd.dylib", "add", my_add, usize, a: usize, b: usize);
    println!("10 + 20 = {}", my_add(10, 20));

    get_libfn!("libstd.dylib", "print_hello", my_print_hello, ());
    my_print_hello();
}

输出是

Hello World
10 + 20 = 30
hello

依赖