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 的封送处理错误,这些错误可能会损坏堆栈。

求解答

根据您提供的信息,有以下几个可能的原因导致调用时出现 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 函数)来处理字符串编码问题。
    建议您对这些可能的原因进行排查,并根据具体情况选择相应的解决方法。如果问题仍然存在,建议您提供更加详细的错误信息和代码,以便更好地定位和解决问题。

我的调用代码:

StringBuilder errPtr = new StringBuilder(1024);
            IntPtr[] arr = new IntPtr[1];
            IntPtr[] arr2 = new IntPtr[1];
            arr[0] = Marshal.StringToHGlobalAnsi(mackey);
            arr2[0] = Marshal.StringToHGlobalAnsi(macvalue);

            StringBuilder IMEI = new StringBuilder(1024);
            StringBuilder strSN = new StringBuilder(sn, 1024);
            Int32 len = 1024; Int32 size = 1;
            bool result = GetIMEI_BT_WIFI_EX2(IMEI , strSN , arr, arr2, 1, errPtr, 1024);
            String mac = Marshal.PtrToStringAnsi(arr2[0]);
            Marshal.FreeHGlobal(arr[0]);
            Marshal.FreeHGlobal(arr2[0]);

我觉得是C#这里函数类型写错了,用StringBuilder对应char*?博主可以看看下面的链接,C#与C++类型对应关系
https://blog.csdn.net/weixin_30500663/article/details/97254883