首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从Rust发送到STATUS_HEAP_CORRUPTION DLL时发生C#错误

将数据从Rust发送到STATUS_HEAP_CORRUPTION DLL时发生C#错误
EN

Stack Overflow用户
提问于 2021-01-27 07:04:43
回答 1查看 1.6K关注 0票数 1

当我将字符串数据从Rust发送到C# DLL时,我一直面临一个问题。锈蚀执行程序将显示以下错误。

error: process didn't exit successfully: target\release\test.exe (exit code: 0xc0000374, STATUS_HEAP_CORRUPTION)

在我发送数据几次之后,Rust exe会崩溃(没有确切的模式)。

下面是关于锈菌如何与C# DLL通信的代码。

代码语言:javascript
复制
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代码。我试着在铁锈里做同样的事:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 08:57:33

通过将第三个参数arg_3_c_str从空字符串更改为空指针ptr::null(),可以解决此问题。最后的解决办法如下。

代码语言:javascript
复制
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错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65914315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档