5个版本 (3个破坏性更新)

0.10.0 2024年1月17日
0.9.1 2023年11月18日
0.8.0 2023年10月30日
0.7.0 2023年7月12日

操作系统 类别中排名第 147

Download history 2/week @ 2024-05-21 12/week @ 2024-07-02 94/week @ 2024-07-23

每月下载量 94

MIT/Apache

52KB
1.5K SLoC

Dylink

Crates.io Crates.io Crates.io docs.rs dylink-rs

Dylink 为动态库的加载提供了一个运行时动态链接框架。

如果您加载的动态库并不总是保证存在,这个crate可能非常有用,这可以让您在代码中提供回退方案。


相关链接

功能

  • 线程安全库加载。
  • 宏属性

支持的平台

适用于所有主要平台。

Windows Linux MacOS

使用方法

将以下内容添加到您的 Cargo.toml

[dependencies]
dylink = "0.9"

示例

以下是在Windows上通过 Library 手动打开库的示例。

use dylink::*;
use std::mem;

// Open the Kernel32.dll library.
let lib = Library::open("Kernel32.dll").expect("Failed to open library");

// Get the symbol for the GetLastError function.
let sym = lib.symbol("GetLastError").unwrap();

// Cast the symbol to the appropriate function signature.
let get_last_error: unsafe extern "system" fn() -> u32 = unsafe {mem::transmute(sym)};

let result = unsafe {get_last_error()};

// Call the function and assert its return value.
assert_eq!(result, 0);

以下是在Windows上使用 dylink 属性的示例。此示例通过与Kernel32.dll库中的函数交互,演示了 dylink crate的懒加载功能。

use dylink::*;

// Define a static LibLock for the Kernel32.dll library.
static KERNEL32: sync::LibLock = sync::LibLock::new(&["Kernel32.dll"]);

// Use the `dylink` attribute to declare functions from the Kernel32.dll.
#[dylink(library=KERNEL32)]
extern "system-unwind" {
    fn GetLastError() -> u32;
    fn SetLastError(_: u32);
}

// Use the declared functions, which will be loaded lazily when called.
unsafe {
   SetLastError(52);
   assert_eq!(52, GetLastError());
}

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,将按上述方式双许可,不附加任何其他条款或条件。

依赖项

~255–700KB
~17K SLoC