using System; using System.Runtime.InteropServices; namespace JEngine.Core { [StructLayout(LayoutKind.Explicit)] public unsafe class UnsafeMgr { /// /// Unsafe Mgr instance /// public static UnsafeMgr Instance = new UnsafeMgr(); /// /// Get pointer of object (will not pin) /// /// /// /// public void* GetPtr(T obj) => _objectToVoidPtr(obj); /// /// Get object from pointer /// /// /// /// public T FromPtr(void* ptr) => (T)_voidPtrToObject(ptr); private delegate void* ObjectToVoidPtrDelegate(object obj); private delegate object VoidPtrToObjectDelegate(void* ptr); [FieldOffset(0)] private readonly ObjectToVoidPtrDelegate _objectToVoidPtr; [FieldOffset(0)] private readonly VoidPtrToObjectDelegate _voidPtrToObject; [FieldOffset(0)] Func func; private UnsafeMgr() { _objectToVoidPtr = null; _voidPtrToObject = null; func = Out; } private static object Out(object o) => o; } }