Чем отличается .NET Framework от .NET Core / .NET 5+?
Историческая картина
.NET Framework появился в 2002 году как платформа для Windows. К середине 2010-х у него накопились проблемы: привязка к Windows, огромный монолитный рантайм, установленный в систему, невозможность быстро выпускать изменения без риска сломать тысячи приложений на машине.
В 2016 году Microsoft выпустила .NET Core — переписанную с нуля кроссплатформенную реализацию. В 2020 году ветки объединили под одним именем: после .NET Core 3.1 вышел .NET 5 (цифру 4 пропустили, чтобы не путать с Framework 4.x), и слово «Core» из названия убрали.
Ключевые различия
| Аспект | .NET Framework | .NET (Core) 5+ |
|---|---|---|
| ОС | Только Windows | Windows, Linux, macOS; x64, ARM64 |
| Установка | Системный компонент, одна версия 4.x на машину | Side-by-side: несколько версий рядом |
| Деплой | Требует установленный Framework | Framework-dependent, self-contained, single-file, NativeAOT |
| Исходный код | Закрыт (частично открыт для чтения) | Open source (MIT), github.com/dotnet |
| Веб | ASP.NET (System.Web, IIS) | ASP.NET Core (Kestrel, middleware) |
| Производительность | Базовая | Значительно выше (JIT, GC, BCL оптимизированы) |
| Развитие | Только поддержка | Новый релиз ежегодно |
| CLI | MSBuild, Visual Studio | dotnet CLI, SDK-style проекты |
| Контейнеры | Windows-контейнеры (тяжёлые) | Легковесные Linux-образы, chiseled images |
Архитектура: что внутри
- SDK нужен для сборки (
dotnet build), Runtime — только для запуска. - CoreCLR — виртуальная машина: загружает сборки, JIT-компилирует IL в машинный код, управляет памятью (GC), потоками, исключениями.
- Shared framework — набор библиотек (
Microsoft.NETCore.App,Microsoft.AspNetCore.App), которые устанавливаются вместе с рантаймом.
Почему новый .NET быстрее
- Tiered compilation. Метод сначала компилируется быстро и без оптимизаций (Tier 0), а если вызывается часто — перекомпилируется с полными оптимизациями (Tier 1). Старт быстрее, пиковая производительность выше.
- Dynamic PGO (по умолчанию с .NET 8). JIT собирает статистику во время работы (какие типы реально приходят в виртуальные вызовы) и делает девиртуализацию и инлайнинг под реальную нагрузку.
Span<T>,Memory<T>,ArrayPool— вся BCL переписана на работу без лишних аллокаций.- Kestrel и
System.IO.Pipelines— один из самых быстрых веб-серверов по TechEmpower. - System.Text.Json вместо Newtonsoft.Json — UTF-8 напрямую, source generators.
Модели публикации
# Framework-dependent: маленький размер, нужен установленный runtime
dotnet publish -c Release
# Self-contained: рантайм внутри, запускается на «голой» машине
dotnet publish -c Release -r linux-x64 --self-contained true
# Single-file + обрезка неиспользуемого кода
dotnet publish -c Release -r linux-x64 --self-contained -p:PublishSingleFile=true -p:PublishTrimmed=true
# NativeAOT: нативный бинарник, мгновенный старт, без JIT
dotnet publish -c Release -r linux-x64 -p:PublishAot=trueЧто делать с legacy на Framework
Типичные ошибки
- Путать .NET Standard (спецификация API) и .NET Core (реализация).
- Считать, что «.NET 5 — это следующая версия Framework». Нет, это следующая версия Core.
- Выбирать STS-версию для долгоживущего продакшена без плана регулярных обновлений.
- Забывать, что
self-containedпубликация не получает исправления безопасности рантайма автоматически — нужно пересобирать и выкатывать.
Вопросы на засыпку
Почему после .NET Core 3.1 сразу вышел .NET 5?
Чтобы избежать путаницы с .NET Framework 4.x и подчеркнуть, что это единая платформа будущего. Слово «Core» убрали, но ASP.NET Core и EF Core сохранили название, чтобы не путать с ASP.NET MVC 5 и EF 6.
Можно ли в одном процессе запустить код .NET Framework и .NET 8?
Нет, это разные рантаймы. Общаться можно только через межпроцессное взаимодействие (HTTP, gRPC, очереди). Но библиотека под netstandard2.0 может использоваться обоими.
Что такое LTS и STS, какую версию брать в продакшен?
LTS (чётные: 6, 8, 10) поддерживаются 3 года, STS (нечётные: 7, 9) — 18–24 месяца. Для продакшена обычно берут LTS; STS — если команда готова обновляться каждый год ради новых возможностей.
Есть ли в новом .NET AppDomain?
Тип существует для совместимости, но создать второй домен нельзя. Для изоляции и выгрузки плагинов используется AssemblyLoadContext (с isCollectible: true), для изоляции безопасности — отдельные процессы или контейнеры.
Итог
.NET Framework — завершённая Windows-платформа в режиме поддержки. Современный .NET — кроссплатформенный, быстрый, модульный и ежегодно обновляемый. Новые проекты — только на актуальной LTS-версии .NET.