捕获视频图像时Marshal.Copy中的AccessViolationException

时间:2017-07-13 00:26:10

标签: c# interop

我一直在使用下面的代码段从网络摄像头捕获视频帧大约12年,并且它始终没有问题。

var videoHeader = new API32.VIDEOHDR();
videoHeader = (API32.VIDEOHDR)API32.GetStructure(lpVHdr, videoHeader);
var videoData = new byte[videoHeader.dwBytesUsed];
Marshal.Copy(new IntPtr(videoHeader.lpData), videoData, 0, videoHeader.dwBytesUsed);

将项目升级到.NET 4.6.1后,它开始在Marshal.Copy()处抛出 AccessViolationException 。测试显示它在.NET 3.5中有效,但在.NET 4及更高版本中有效。

我已经看过类似的帖子,问题是试图复制比源中更多的比特,但这不是问题。

这是.NET 4中的预期行为吗?

更新:添加VIDEOHDR结构:

[StructLayout(LayoutKind.Sequential)]
public struct VIDEOHDR
{
    [MarshalAs(UnmanagedType.I4)]
    public int lpData;
    [MarshalAs(UnmanagedType.I4)]
    public int dwBufferLength;
    [MarshalAs(UnmanagedType.I4)]
    public int dwBytesUsed;
    [MarshalAs(UnmanagedType.I4)]
    public int dwTimeCaptured;
    [MarshalAs(UnmanagedType.I4)]
    public int dwUser;
    [MarshalAs(UnmanagedType.I4)]
    public int dwFlags;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public int[] dwReserved;
}

0 个答案:

没有答案