using System.Runtime.InteropServices; namespace nspector.Native { internal class NativeArrayHelper { public static T GetArrayItemData(IntPtr sourcePointer) { return (T)Marshal.PtrToStructure(sourcePointer, typeof(T)); } public static T[] GetArrayData(IntPtr sourcePointer, int itemCount) { var lstResult = new List(itemCount); if (sourcePointer != IntPtr.Zero && itemCount > 0) { var sizeOfItem = Marshal.SizeOf(typeof(T)); for (int i = 0; i < itemCount; i++) { lstResult.Add(GetArrayItemData(sourcePointer + (sizeOfItem * i))); } } return lstResult.ToArray(); } public static void SetArrayData(T[] items, out IntPtr targetPointer) { if (items != null && items.Length > 0) { var sizeOfItem = Marshal.SizeOf(typeof(T)); targetPointer = Marshal.AllocHGlobal(sizeOfItem * items.Length); for (int i = 0; i < items.Length; i++) { Marshal.StructureToPtr(items[i], targetPointer + (sizeOfItem * i), true); } } else { targetPointer = IntPtr.Zero; } } public static unsafe void SetArrayDataNative(T[] items, out IntPtr targetPointer) { if (items != null && items.Length > 0) { var sizeOfItem = Marshal.SizeOf(typeof(T)); targetPointer = Marshal.AllocHGlobal(sizeOfItem * items.Length); new Span(items, 0, items.Length).CopyTo(new Span((void*)targetPointer, items.Length)); } else { targetPointer = IntPtr.Zero; } } public static void SetArrayItemData(T item, out IntPtr targetPointer) { var sizeOfItem = Marshal.SizeOf(typeof(T)); targetPointer = Marshal.AllocHGlobal(sizeOfItem); Marshal.StructureToPtr(item, targetPointer, true); } } }