delegate void jdkCALLBACK(int nType, ref IntPtr pContext);
是一个回调函数,在调用C++DLL的方法里会回调一个函数出来,目前的问题在于回调出来的指针类型没有办法转换成结构体,结构体如下:
public struct test
    {
        public int m_devId;
        public char[] m_pstrIp;
        public int m_sPort;
    }
当回调函数出现时,使用结构体指针转换这里出错
testentries = (test)Marshal.PtrToStructure(pContext, typeof(test));
出错信息为:
运行库遇到了错误。此错误的地址为 0x79ee2552,在线程 0x63c 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
我怀疑是在封送结构体指针的时候出了错误,不知道该如何操作,所以请教各位高手

解决方案 »

  1.   

    补充,C++的结构体指针
    typedef struct
    {
    int m_devId;
    char m_pstrIp[20];
    short m_sPort;
    }test, *LPCONFIGINFO;
      

  2.   

    注意结构要使用[StructLayOut]属性
      

  3.   

     我也觉得是结构体的定义问题,毕竟是使用C++的DLL,那是非托管的。定义结构体的时候,最好指定一下
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]至于charset是不是unicode,你可以换换其他的类型试试。在定义char数组的时候使用
    [MarshalAs(UnmanagedType.LPWStr, SizeConst = 100)] 类型和大小,类型的话,也不一定是LPWSTR,也可以试试ByValArray,或者其他什么类型。