C++ 方法
CLIENT_API int  _stdcall  MornsunSvrGetMessage(void * pBuf,UINT nTimeOut)
{
return PublicApi::Instance().GetMessage(pBuf,nTimeOut);
}这里的 void * pBuf 是一个结构的缓冲区
public static extern int MornsunSvrGetMessage(ref IntPtr msg, int nTimeOut);
这样定制可以C++方法后
IntPtr msg;
MornsunSvrGetMessage(ref msg,1000)
我尝试用
 Marshal.PtrToStructure(msg, typeof(ConnectionStatePdu));
方式 转换成 ConnectionStatePdu 就会出现 
尝试读取或写入受保护的内存。这通常指示其他内存已损坏

解决方案 »

  1.   

    void*用IntPtr就可以了,不需要ref。
    另外,由于pBuf是缓冲区,那么要求C#分配内存,如使用Marshal.AllocHGlobal函数来分配内存。
      

  2.   

    我采用 byte[] ABuffer = new byte[10000];
    fixed (byte* p = &ABuffer[0])
    {
         i = AgentApi.MornsunSvrGetMessage(p, 100);
    }
     
    的方式成功分配了缓冲区 也成功获得了 ABuffer 但是我无法将 ABuffer  转换成为 结构
    目前可以知道 ABuffer 中0-1,128-132 ,156-160是有数据的 但是和结构体描述的不一样 不管怎么写
    我都无法将 128-132 还有156-160的数据转换到 结构体里面
      

  3.   

    int i1 = OpStruct.BytesToString(ABuffer, 0, 2);  i1=1234
    String c1 = OpStruct.BytesToString(ABuffer, 128, 4);c1=3333
    String c2 = OpStruct.BytesToString(ABuffer, 156, 4);c2=4444
    目前缓冲区里面的值
    我些的结构目前只能获取i1的值后面全是空
    希望大家能帮我写个结构可以 获得 c1和c2的值。
      

  4.   

    缓冲区显然应该是定义byte[],然后传递首地址,没定义结构体你干嘛强行要转换到结构体啊。