Щойно змінив коментар, мені видалось повідомлення, що коментар змінено, але зразу цього не показало. Прийшлось перезавантажувати сторінку щоб побачити зміни.
Проблема в не тільки в тому що конструктор видаляється. Вона ще і в тому, що AOT не може генерувати код в рантаймі(Reflection.Emit), а це прямо необхідна штука для нормальної швидкодії. Є контейнери які можуть працювати з АОТ і без Reflection.Emit, але вони не такі зручні як звичайні. Наприклад, Splat(https://github.com/reactiveui/splat) він працює за рахунок того, що розробник повиннен самостійно передати делегат який створить інстанс. Це виглядає наступним чином:
Locator.CurrentMutable.Register(() => new Toaster(Locator.Current.Resolve()), typeof(IToaster));
P.S. Помітив що обрізаються \< >. @Admin, ти вкурсі про це?)
Дякую за пояснення. Якщо суть в тому, що AOT викидає конструктори, то чи не можна реєструвати залежності викликаючи new самостійно і обійтись вже існуючими IoC контейнерами і без кодогенераціі?
Тут більша проблема Reflection.Emit. На AOT платформах він відсутній як класс.
В Xamarin є режим AOT компіляції і лінковка під час якої викидують методи/класси/збірки. В результаті, може виявитися що конструктор сервісу, який зареєстрований в звичайному ІоС контейнері, був просто викинутить оскільки ніхто явно його не визивав. Всі ці оптимізації можуть значно покращити швидкість холодного старту.
https://docs.microsoft.com/en-us/xamarin/mac/internals/aot
В Unity є IL2CPP (Intermediate Language To C++) - це штука яка компілить IL код в С++ і потім білдить його уже як С++ застосунок. Цей спосіб вимушені міра, оскільки iOS дозволяє тільки AOT компіляцію от вони і викручуються.
Nice catch!
Здається воно залишилось після моїх старих експереметнів. Звідти уже нічого не використовується. Запустив cleanup всього проекту щоб прибрати подібні штуки.
Цього я також, ще не зробив
Оскільки ви помітили, то доведеться виправити 😄
Щойно змінив коментар, мені видалось повідомлення, що коментар змінено, але зразу цього не показало. Прийшлось перезавантажувати сторінку щоб побачити зміни.
Це баг. Забув додати оповіщення до цього розділу :)
Виправлю.
До речі, лист не прийшов про ваш коментар. Це баг чи фіча?
Це ви про мене? То не я на відео.
В цьому розділі я поширюю цікаві матеріали які знаходжу.
Ага, так ось хто такий Alex ))
Виправив обрізку тегів, тепер в блоках з кодом нічого не має обрізатися.
Проблема в не тільки в тому що конструктор видаляється. Вона ще і в тому, що AOT не може генерувати код в рантаймі(Reflection.Emit), а це прямо необхідна штука для нормальної швидкодії. Є контейнери які можуть працювати з АОТ і без Reflection.Emit, але вони не такі зручні як звичайні. Наприклад, Splat(https://github.com/reactiveui/splat) він працює за рахунок того, що розробник повиннен самостійно передати делегат який створить інстанс. Це виглядає наступним чином:
Locator.CurrentMutable.Register(() => new Toaster(Locator.Current.Resolve()), typeof(IToaster));
P.S. Помітив що обрізаються \< >. @Admin, ти вкурсі про це?)
Дякую за пояснення. Якщо суть в тому, що AOT викидає конструктори, то чи не можна реєструвати залежності викликаючи new самостійно і обійтись вже існуючими IoC контейнерами і без кодогенераціі?
Тут більша проблема Reflection.Emit. На AOT платформах він відсутній як класс.
В Xamarin є режим AOT компіляції і лінковка під час якої викидують методи/класси/збірки. В результаті, може виявитися що конструктор сервісу, який зареєстрований в звичайному ІоС контейнері, був просто викинутить оскільки ніхто явно його не визивав. Всі ці оптимізації можуть значно покращити швидкість холодного старту. https://docs.microsoft.com/en-us/xamarin/mac/internals/aot
https://docs.microsoft.com/en-us/xamarin/android/deploy-test/linker
В Unity є IL2CPP (Intermediate Language To C++) - це штука яка компілить IL код в С++ і потім білдить його уже як С++ застосунок. Цей спосіб вимушені міра, оскільки iOS дозволяє тільки AOT компіляцію от вони і викручуються.
https://docs.unity3d.com/Manual/IL2CPP.html
А які проблеми з рефлексією в Xamarin, Unity?
Nice catch! Здається воно залишилось після моїх старих експереметнів. Звідти уже нічого не використовується. Запустив cleanup всього проекту щоб прибрати подібні штуки.