我一直在使用下面的代码段从网络摄像头捕获视频帧大约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;
}