using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; namespace NAPS2 { public static class Unmanaged { public static Unmanaged CopyOf(T value) { return new Unmanaged(value); } public static UnmanagedArray CopyOf(T[] value) { return new UnmanagedArray(value); } } public class Unmanaged : UnmanagedBase { public Unmanaged() : this(default(T)) { } public Unmanaged(T value) { if (!ReferenceEquals(value, null)) { Size = Marshal.SizeOf(typeof(T)); Pointer = Marshal.AllocHGlobal(Size); Marshal.StructureToPtr(value, Pointer, false); } } protected override T GetValue() { if (Pointer == IntPtr.Zero) { // T must be a reference type, so this returns null return default(T); } return (T)Marshal.PtrToStructure(Pointer, typeof(T)); } protected override void DestroyStructures() { Marshal.DestroyStructure(Pointer, typeof(T)); } } }