gpt4 book ai didi

c# - 从Rust向C#DLL发送数据时发生STATUS_HEAP_CORRUPTION错误

转载 作者:行者123 更新时间:2023-12-03 11:38:09 24 4
gpt4 key购买 nike

当我从Rust向C#DLL发送字符串数据时,我一直遇到一个问题。 Rust exe将显示以下错误。error: process didn't exit successfully: target\release\test.exe (exit code: 0xc0000374, STATUS_HEAP_CORRUPTION)我几次发送数据后,Rust exe将崩溃(无确切模式)。
以下是Rust如何与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代码。我正在尝试在Rust中做同样的事情:
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);
}

最佳答案

通过将第三个参数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()))
}
}
当他指出Rust和Java实现之间的区别时,所有功劳都归@Jmb所致。
但是,还有另一个有趣的话题需要讨论,为什么传递空字符串而不是null指针会导致STATUS_HEAP_CORRUPTION错误。

关于c# - 从Rust向C#DLL发送数据时发生STATUS_HEAP_CORRUPTION错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65914315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com