public void CleanUpNativeData(IntPtr pNativeData)
        {
            CEntityArray arr = (CEntityArray)Marshal.PtrToStructure(pNativeData, typeof(CEntityArray));

            Marshal.FreeCoTaskMem(arr.entityArray);
            Marshal.FreeCoTaskMem(pNativeData);
            for (int i = 0; i < arr.size; i++)
            {
                IntPtr  p      = new IntPtr(arr.entityArray.ToInt64() + i * Marshal.SizeOf(typeof(CEntity)));
                CEntity entity = (CEntity)Marshal.PtrToStructure(p, typeof(CEntity));
                Marshal.FreeCoTaskMem(entity.name);
            }
        }
        public object MarshalNativeToManaged(IntPtr pNativeData)
        {
            CEntityArray arr = (CEntityArray)Marshal.PtrToStructure(pNativeData, typeof(CEntityArray));

            Entity[] managedEntityArray = new Entity[arr.size];

            for (int i = 0; i < arr.size; i++)
            {
                IntPtr  p      = new IntPtr(arr.entityArray.ToInt64() + i * Marshal.SizeOf(typeof(CEntity)));
                CEntity entity = (CEntity)Marshal.PtrToStructure(p, typeof(CEntity));

                managedEntityArray[i]           = new Entity();
                managedEntityArray[i].name      = Marshal.PtrToStringAnsi(entity.name);
                managedEntityArray[i].hp        = entity.hp;
                managedEntityArray[i].isMonster = entity.isMonster != 0;
                managedEntityArray[i].isNpc     = entity.isNpc != 0;
                managedEntityArray[i].loc       = entity.loc;
                managedEntityArray[i].maxHp     = entity.maxHp;
                managedEntityArray[i].type      = entity.type;
                managedEntityArray[i].attitude  = (Attitude)entity.attitude;
            }

            return(managedEntityArray);
        }