Во многих примерах API мы получаем IntPtr в качестве указателя на структуру, и я вижу, что люди выделяют новую память, копируют все данные, а затем создают новую структуру, насколько я понимаю.Или они используют Marshal.PtrToStructure ().Какая разница в использовании Marshal.PtrToStructure () и просто ref 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;
}
Чем это отличается?Это переводится на то же самое?Или это более эффективно во втором способе, но есть некоторые опасности при его использовании?