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); }