add.h #pragma once #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) int add(int a, int b, char* str); #ifdef __cplusplus } #endif add.cpp #include "add.h" #includeint add(int a, int b, char* str) { strcpy(str, u8"hello, world! 你好!~"); return a + b; } Cargo.toml [dependencies] libloading = "0.8" libc = "0.2.153" main.rs use libc::*; use libloading::{Library, Symbol}; type FnAdd = unsafe extern fn(a: i32, b: i32, c: *mut c_char) -> i32; unsafe { let lib = Library::new("TestDll.dll").unwrap(); let func_add: Symbol = lib.get(b"add").unwrap(); let mut str_out = [0u8; 256]; // 分配存储空间 println!("{}", func_add(1, 2, str_out.as_mut_ptr() as *mut i8)); let sv = &str_out[0..strlen(str_out.as_ptr() as *const i8)]; // 通过strlen构造对应字符串的数组 let s = String::from_utf8_unchecked(sv.to_vec()); // 字符串使用utf8编码的u8 println!("{}", s); format!("{}", s) }