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 异常:
我的调用代码:
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