当我将字符串数据从Rust发送到C# DLL时,我一直面临一个问题。锈蚀执行程序将显示以下错误。
error: process didn't exit successfully: target\release\test.exe (exit code: 0xc0000374, STATUS_HEAP_CORRUPTION)
在我发送数据几次之后,Rust exe会崩溃(没有确切的模式)。
下面是关于锈菌如何与C# DLL通信的代码。
extern crate libloading;
fn call_dynamic(arg_1_str: &str, arg_2_int: i32) -> Result<i32, Box<dyn std::error::Error>> {
let arg_1_c_str = CString::new(arg_str_1).unwrap();
// This is intended
let arg_3_c_str = CString::new("").unwrap();
let arg_1_c_char = arg_1_c_str.as_ptr();
let arg_3_c_char = arg_3_c_str.as_ptr();
let lib = libloading::Library::new("Test.dll").unwrap();
unsafe {
let func: libloading::Symbol<
unsafe fn(
arg_1: *const c_char,
arg_2: i32,
arg_3: *const c_char,
) -> i32,
> = lib
.get(b"GetStatus")
.unwrap();
Ok(func(arg_1_c_char, arg_2_int, arg_3_c_char))
}
}用于与外部DLL通信的库是libloading。
有什么可能导致这一错误发生,是否有任何方法来克服这个问题?非常感谢你的帮助。
注意:我没有访问C# DLL的源代码。因此,我不知道里面发生了什么。
下面是一些可以工作的Java代码。我试着在铁锈里做同样的事:
public interface TestDLL extends Library {
int GetStatus (String arg1, int arg2, String arg3);
}
public int GetStatusFromDLL (String arg1, int arg2) {
TestDLL test_dll = (TestDLL)Native.loadLibrary ("Test", TestDLL.class);
return test_dll.GetStatus (arg1, arg2, null);
}发布于 2021-01-28 08:57:33
通过将第三个参数arg_3_c_str从空字符串更改为空指针ptr::null(),可以解决此问题。最后的解决办法如下。
fn call_dynamic(arg_1_str: &str, arg_2_int: i32) -> Result<i32, Box<dyn std::error::Error>> {
let arg_1_c_str = CString::new(arg_str_1).unwrap();
let arg_1_c_char = arg_1_c_str.as_ptr();
let lib = libloading::Library::new("Test.dll").unwrap();
unsafe {
let func: libloading::Symbol<
unsafe fn(
arg_1: *const c_char,
arg_2: i32,
arg_3: *const c_char,
) -> i32,
> = lib
.get(b"GetStatus")
.unwrap();
Ok(func(arg_1_c_char, arg_2_int, ptr::null()))
}
}所有的信用都属于@Jmb,因为他指出了Rust和Java实现之间的区别。
但是,还有一个有趣的问题要讨论为什么传入空字符串而不是空指针会导致STATUS_HEAP_CORRUPTION错误。
https://stackoverflow.com/questions/65914315
复制相似问题