NativeAOT снова на слуху, потому что в .NET 11 Preview 7 его сделали режимом по умолчанию в CLI ради быстрого старта. Разберём, что это вообще такое и чем отличается от привычной модели.
Обычно .NET работает так. Код на C# компилируется в промежуточный язык IL, а в нативные инструкции его переводит JIT уже во время запуска. Это гибко, но у первого запуска есть цена на разогрев, а вместе с приложением едет рантайм, который всё это исполняет.
NativeAOT переворачивает подход. Компиляция в машинный код происходит заранее, на этапе сборки. На выходе вы получаете самодостаточный нативный исполняемый файл, внутри которого нет ни IL, ни JIT. Приложению не нужен установленный рантайм, оно просто запускается.
🔴 Что это даёт. Старт почти мгновенный, ведь разогревать JIT нечего. Память на старте меньше, а размер развёртывания компактнее, потому что лишнее вырезается при сборке. Для консольных утилит, бессерверных функций и контейнеров, где важен быстрый холодный старт, это большой плюс.
🔴 Есть и цена. Раз всё решается на этапе сборки, в рантайме нельзя генерировать код и сильно ограничена рефлексия, ведь компилятор должен заранее видеть, что используется. Часть библиотек, завязанных на динамику, просто не поедет. Плюс сборка идёт под конкретную платформу, и кросс-компиляция не всегда проста.
NativeAOT отлично ложится на маленькие быстрые сервисы и утилиты, где ценны холодный старт и компактность. Для больших приложений с тяжёлой рефлексией и динамической загрузкой сначала проверьте совместимость. Включается это в файле проекта.
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор