#dll #msvc #dynamic #linker

dynlib

针对Rust-MSVC的dll加载的高级、相对安全的绑定

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2016年11月21日

#11#msvc

Apache-2.0

2MB
139

包含 (静态库,1MB) src/test_dll.dll.lib,(Windows DLL,725KB) src/test_dll.dll

dynlib

为Rust MSVC提供的简单Microsoft DLL加载器绑定

文档

将以下内容包含到您的项目中

[dependencies]
dynlib = "0.0.1"

此crate只能在Rust MSVC外部使用。请注意。

此提供对Windows平台上的LoadLibraryExA接口的简单抽象。此crate功能的一个非常简单的示例


use dynlib::{VoidPtr,LoadWinDynLib,DynLibWin};

let lib: DynLibWin = LoadWinDynLib::new()
			.search_application_dir()
			.load("test_dll.dll")?;

let func: VoidPtr = lib.load_function("addition")?;
let callable: extern "Rust" fn(u64,u64)->u64 = unsafe{ mem::transmute(func)};
assert_eq( callable(5u64,5u64), 10u64);

需要不安全代码来强制转换函数指针。当DynLibWin类型被丢弃时,它不会卸载其模块。它必须手动释放。当你释放DynLibWin时,从它拉取的所有函数都将无效,并从内存中释放。因此调用它们会导致内存段错误,并可能导致你的应用程序崩溃。

我只是觉得让DLL在应用程序的生命周期内存在是一个更安全的替代方案。加载的DLL内存是在进程间共享的,所以这里没有节省内存的论点。

依赖关系