在许多api示例中,我们将IntPtr用作结构的指针,并且据我所知,人们会分配新的内存,复制所有数据,然后按照我的理解创建新的结构。或者他们使用Marshal.PtrToStructure()。使用Marshal.PtrToStructure()和仅引用Struct有什么区别?如果我只需要读取一些结构数据。
[DllImport("some.dll")]
static extern IntPtr GetPoint(IntPtr point);
delegate IntPtr GetPointDelegate(IntPtr point);
// assing function that will be invoked
GetPointDelegate callback = ConsumePoint;
// delegate implementation
IntPtr ConsumePoint(IntPtr ptr)
{
Point point = (Point)Marshal.PtrToStructure(ptr, typeof(Point));
// do stuff with point
return IntPtr.Zero;
}
[DllImport("some.dll")]
static extern IntPtr GetPoint(ref Point point);
delegate IntPtr GetPointDelegate(ref Point point);
GetPointDelegate callback = ConsumePoint;
IntPtr ConsumePoint(ref Point point)
{
// do stuff with point
return IntPtr.Zero;
}
这有何不同? 这是翻译成同一件事吗?还是第二种方法更有效,但是使用它时会有一些危险?