CrisYoung 2023-05-26 09:23 采纳率: 25%
浏览 20

C#调用C++的dll遇到的问题

C++给的接口:

typedef bool (FUNDLL* FUN_GetIMEI_BT_WIFI_EX2)(const char * strIMEI, const char * strSMTSN, char ** vecField, char ** vecRecord, int size, char * strerr, int errlen);

C#的调用方式:

private static extern bool GetIMEI_BT_WIFI_EX2(StringBuilder strIMEI1, StringBuilder custsn, IntPtr[] vecField, IntPtr[] vecRecord,ref Int32 size, StringBuilder strerr,ref Int32 errlen);

这么调用会报错“System.AccessViolationException:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
请问是什么原因呢?
int那里不ref也一样,但不是报错,而是直接闪退了,看输出说
运行库遇到了错误。此错误的地址为 0x79e8eda2,在线程 0xaa4 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。

求解答

  • 写回答

3条回答 默认 最新

  • 蓝色心灵-海 2023-05-26 09:36
    关注

    根据您提供的信息,有以下几个可能的原因导致调用时出现 System.AccessViolationException 异常:

    1. 参数传递错误:C++ 和 C# 的参数传递方式不同,可能会导致传递给 C++ 函数的参数类型或值不正确,从而导致内存溢出或访问非法内存区域。可以检查传递给函数的参数类型和值是否正确,并确保在传递指针参数时使用相应的函数。
    2. 内存管理错误:C++ 和 C# 使用不同的内存管理方式,可能会导致内存泄漏或访问非法内存区域。可以使用 C# 的内存管理方式(如使用 Marshal.AllocHGlobal 和 Marshal.FreeHGlobal 函数)来分配和释放内存,同时确保在 C++ 中正确地使用内存管理函数(如 new 和 delete 操作符)。
    3. 字符串编码问题:C++ 和 C# 使用不同的字符串编码方式,可能会导致在传递字符串参数时出现编码问题,从而导致访问非法内存区域。可以使用 C# 中的 Encoding 类和 C++ 中的相应编码函数(如 MultiByteToWideChar 和 WideCharToMultiByte 函数)来处理字符串编码问题。
      建议您对这些可能的原因进行排查,并根据具体情况选择相应的解决方法。如果问题仍然存在,建议您提供更加详细的错误信息和代码,以便更好地定位和解决问题。
    评论

报告相同问题?

问题事件

  • 创建了问题 5月26日