如何在 C 中调用 Rust 函数?

How to call a Rust function in C?

发帖时向我展示的第一个“类似问题”称为“如何在 Rust 中调用 C 函数”。这与我需要的相反。我能找到的每个教程在技术上确实回答了我的问题,只是通过在 DLL 中导出 Rust 函数,以便 C 可执行文件可以调用它,使用 extern "C".

但是我有一个 Rust 可执行文件,它正在调用一个 C DLL 函数,该函数将 Rust 函数指针作为参数(我还没有真正编写这个 C 函数)。任何基本示例演示如何执行此操作?我已经让 Rust 调用一些 C DLL 函数,但我需要为 Rust 和 C 编写代码,以便 C 可以执行 Rust 回调。

如果您将此 C 代码编译为名为 lib.dll 的库,则导出一个函数,该函数接受一个指向不带参数且 returns 没有任何参数的函数的指针:

__declspec(dllexport) void foo(void (*callback)()) {
    callback();
}

然后这个 Rust 代码将函数 callback 发送到那个 C 函数。执行后,它会打印行 "callback()":

extern "C" fn callback() -> () {
    println!("callback()");
}

fn main() {
    println!("main()");
    call_dynamic();
}

fn call_dynamic() -> Result<u32, Box<dyn std::error::Error>> {
    unsafe {
        let lib = libloading::Library::new("lib.dll")?;
        let foo: libloading::Symbol<extern "C" fn(extern "C" fn()) -> u32> = lib.get(b"foo")?;
        Ok(foo(callback))
    }
}

您应该会在您的控制台中看到:

main()
callback()

我在 Windows 并使用此命令编译了 C 代码:

gcc --shared lib.c -o lib.dll

Rust 代码 运行 是这样的:

cargo run