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