Marshal.Copy()的例外情况

时间:2017-11-24 18:27:39

标签: c# marshalling

为了更快地访问,我想使用字节数组读取位图的像素。因此,我使用了此处提供的代码: https://msdn.microsoft.com/de-de/library/system.drawing.imaging.imagelockmode(v=vs.110).aspx

这是我的代码:

private static int GetBitmapDataInByteArray(out byte[] bArr, ref System.Drawing.Bitmap bmp)
{
    int Length = -1;
    System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(
        new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
        System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
    Length = System.Math.Abs(bmpData.Stride) * bmpData.Height;
    bArr = new byte[Length];

    /* Exception on this line: */
    System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, bArr, 0, Length);

    bmp.UnlockBits(bmpData);

    return Length;
}

我收到了System.AccessViolationException - 读取或写入受保护的内存。

有人知道为什么吗?

1 个答案:

答案 0 :(得分:1)

Philippe Pare是对的。手动指定pixelformat可以解决问题。也许是32/64位之间的cobflict?