private void cbRealDataFun(int lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr dwUser)
        {
            byte[] bytes = new byte[dwBufSize];
            bytes[0] = Marshal.ReadByte(pBuffer);
            memcpy( bytes,pBuffer, (int)dwBufSize);
            Marshal.Copy(bytes, 0, pBuffer, (int)dwBufSize);
}将dwBufSize大小,起始地址为pBuffer的内存复制到byte数组中,总是提示Marshal.Copy的source为空,有什么问题?pbuffer是传过来的不为空啊

解决方案 »

  1.   

    Marshal.copy()方法用来在托管对象(数组)和非托管对象(IntPtr)之间进行内容的复制
    Copy(array<Byte>[]()[], Int32, IntPtr, Int32) 将一维的托管 8 位无符号整数数组中的数据复制到非托管内存指针。Copy(array<Char>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管字符数组复制到非托管内存指针。Copy(array<Double>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管双精度浮点数组复制到非托管内存指针。Copy(array<Int16>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管 16 位带符号整数数组复制到非托管内存指针。Copy(array<Int32>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管 32 位带符号整数数组复制到非托管内存指针。Copy(array<Int64>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管 64 位带符号整数数组复制到非托管内存指针。Copy(IntPtr, array<Byte>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 8 位无符号整数数组。Copy(IntPtr, array<Char>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管字符数组。Copy(IntPtr, array<Double>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管双精度浮点数组。Copy(IntPtr, array<Int16>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 16 位带符号整数数组。Copy(IntPtr, array<Int32>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 32 位带符号整数数组。Copy(IntPtr, array<Int64>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 64 位带符号整数数组。Copy(IntPtr, array<IntPtr>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 IntPtr 数组。Copy(IntPtr, array<Single>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管单精度浮点数组。Copy(array<IntPtr>[]()[], Int32, IntPtr, Int32) 将数据从一维托管 IntPtr 数组复制到非托管内存指针。Copy(array<Single>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管单精度浮点数组复制到非托管内存指针。
    你应该用的这个的重载:Copy(array<Byte>[]()[], Int32, IntPtr, Int32) 将一维的托管 8 位无符号整数数组中的数据复制到非托管内存指针。看看参数是否正确?参数正确的话就是  Marshal.Copy的bug ,有人提过。
      

  2.   

    不是那个重载。
    我的Marshal.Copy(bytes, 0, pBuffer, (int)dwBufSize);用的这个重载:
    Marshal.Copy (IntPtr, Byte[], Int32, Int32) ;
    是要把将数据从非托管内存指针复制到托管 8 位无符号整数数组。它提示说第一个参数即resource的值不能空,很奇怪。第一个参数是“非托管内存指针”吧,而且也不为空。使用marshal的其它方法如Marshal.ReadByte (IntPtr) 方法也提示错误,应该不是copy的bug
    那么是这个指针有问题吗?
      

  3.   

    用readbyte方法的时候,异常报错为:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
      

  4.   

    将C#数组传给具有IntPtr的托管代码函数,需要先申请一段非托管的内存空间。
    我要从IntPtr所指的内存空间复制到数组,直接用IntPtr所指的内存空间就可以吧