Native AOT заставил меня переписать весь .NET проект
#dotnet #NativeAOT #csharp
✅
Переход на Native AOT — это не флаг в .csproj, а отказ от reflection-зависимостей по всему проекту.
📈
Чтобы поставлять C#-утилиту нативным бинарником без установки .NET Runtime, придётся заменить всё, что решает поведение в рантайме, на генерацию кода при сборке.
🔧 Reflection-зависимости пришлось выпилить одну за другой: System.CommandLine.Hosting, Scrutor (декораторы переехали на keyed services с [FromKeyedServices]), а сериализация — на source-generated JsonSerializerContext с явным списком CLR-типов.
⚠️ Убрав хост, потеряли Dispose service provider’а — процесс завершался до того, как асинхронный вывод логов долетал до консоли. Лечится через using var serviceProvider.
Читаем:
В статье разобрана финальная модель поставки в .NET 10 — пять NuGet-пакетов за одним именем команды, порядок публикации, managed fallback через RID any и почему Native AOT требует отдельной GitHub Actions job на каждую ОС.
https://habr.com/ru/articles/1085386/
@aStateOfNet
#dotnet #NativeAOT #csharp
✅
Переход на Native AOT — это не флаг в .csproj, а отказ от reflection-зависимостей по всему проекту.
📈
Чтобы поставлять C#-утилиту нативным бинарником без установки .NET Runtime, придётся заменить всё, что решает поведение в рантайме, на генерацию кода при сборке.
🔧 Reflection-зависимости пришлось выпилить одну за другой: System.CommandLine.Hosting, Scrutor (декораторы переехали на keyed services с [FromKeyedServices]), а сериализация — на source-generated JsonSerializerContext с явным списком CLR-типов.
⚠️ Убрав хост, потеряли Dispose service provider’а — процесс завершался до того, как асинхронный вывод логов долетал до консоли. Лечится через using var serviceProvider.
Читаем:
В статье разобрана финальная модель поставки в .NET 10 — пять NuGet-пакетов за одним именем команды, порядок публикации, managed fallback через RID any и почему Native AOT требует отдельной GitHub Actions job на каждую ОС.
https://habr.com/ru/articles/1085386/
@aStateOfNet