使用Marshal方法时访问冲突异常.循环中的PtrToStructure
本文关键字:循环 PtrToStructure 异常 访问冲突 Marshal 方法 使用 | 更新日期: 2023-09-27 18:17:01
在我的程序(c#)中,我使用了Marshal方法。转换对象,在循环中将内存地址添加到结构中。在第一个元素,这工作正常。但是在第二个元素处,发生了访问冲突异常。
访问冲突异常只发生在win7(64位)上,不发生在winxp(32位)上。
我不知道原因和解决办法。
请帮帮我。
注意:我使用。net Framework 3.5。
代码如下:
[StructLayout(LayoutKind.Sequential)]
public struct gpc_vertex
{
public float x;
public float y;
};
private ArrayList DoPolygonOperation()
{
IntPtr currentVertex = vertexList.vertexes;
gpc_vertex oVertext = new gpc_vertex();
for (int j = 0; j < vertexList.num_vertices; j++)
{
PositionF pos = new PositionF();
oVertext = (gpc_vertex)Marshal.PtrToStructure(currentVertex, typeof(gpc_vertex));
//Access violation exception
pos.X = oVertext.x;
pos.Y = oVertext.y;
Marshal.DestroyStructure(currentVertex, typeof(gpc_vertex));
currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));
posList.Add(pos);
}
}
谢谢。
当我更改一些代码时,不会发生访问冲突。然而,我不明白这个问题的根本原因。发生什么访问冲突异常?
代码修改如下:
private ArrayList DoPolygonOperation()
{
IntPtr currentVertex = vertexList.vertexes;
gpc_vertex oVertext = new gpc_vertex();
int currentOffset = 0;
for (int j = 0; j < vertexList.num_vertices; j++)
{
PositionF pos = new PositionF();
oVertext = (gpc_vertex)Marshal.PtrToStructure((IntPtr)(currentVertex.ToInt64() + currentOffset), typeof(gpc_vertex));
pos.X = oVertext.x;
pos.Y = oVertext.y;
Marshal.DestroyStructure(currentVertex, typeof(gpc_vertex));
currentOffset += Marshal.SizeOf(oVertext);
posList.Add(pos);
}
}