Платформа .NET: SDK, runtime, версии, сборки, NuGet, solution и csproj
↑ 1.3 C♯: основы языка · → Следующая
Зачем это на собесе
базовые вопросы любого .NET-собеса: что такое .NET, чем SDK отличается от runtime, что такое сборка, как устроен solution. В проекте 80+ проектов в одном solution (
corebackend.slnx), так что это ещё и практика.
Объяснение
Что такое .NET сегодня
- .NET (бывший .NET Core) — кроссплатформенная open-source платформа: Windows, Linux, macOS, контейнеры. Версии: .NET 8 (LTS, поддержка 3 года), .NET 9 (STS, 18 месяцев), .NET 10 (LTS).
- .NET Framework 4.x — старая платформа только для Windows, в режиме поддержки.
- .NET Standard — устаревшая спецификация общего API для библиотек, совместимых со старым Framework (в проекте один
netstandard2.0— генератор исходников Roslyn, которому это требуется).
SDK и runtime
- Runtime (
Microsoft.NETCore.App,Microsoft.AspNetCore.App) — нужен для запуска: CLR, базовые библиотеки. - SDK — для разработки и сборки: компилятор Roslyn, MSBuild, CLI
dotnet, шаблоны. Включает runtime. - В Docker: сборка в образе
mcr.microsoft.com/dotnet/sdk:9.0, запуск вaspnet:9.0(multi-stage), чтобы финальный образ был меньше. global.jsonфиксирует версию SDK для репозитория.
Сборка (assembly)
- Результат компиляции проекта:
.dll(или.exe) с IL-кодом и метаданными (типы, члены, ссылки). - Единица развёртывания, версионирования и безопасности. Модификатор
internal= видно только внутри сборки (или дляInternalsVisibleTo, например тестам). - При запуске CLR загружает сборки и JIT-компилирует IL в машинный код.
Проект и solution
.csproj— SDK-style MSBuild-файл: целевой фреймворк, зависимости, настройки.
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<ProjectReference Include="..\..\core\domain\domain.csproj" />
</ItemGroup>
</Project>- Solution (
.slnили новый XML-формат.slnx) — набор проектов для IDE и сборки. - Directory.Build.props — общие настройки для всех проектов в каталоге и ниже (версия языка, анализаторы, nullable).
- Directory.Packages.props — централизованное управление версиями NuGet (Central Package Management): одна версия пакета на весь solution.
NuGet
Пакетный менеджер .NET. dotnet add package, dotnet restore. Свои пакеты (общее ядро микросервисов) публикуют во внутренний feed (GitLab Package Registry).
CLI
dotnet new webapi -n PatientApi
dotnet build -c Release
dotnet test
dotnet run --project src/PatientApi
dotnet publish -c Release -o out # подготовка к деплою
dotnet ef migrations add Init # инструменты (dotnet-tools.json)Варианты публикации
- Framework-dependent — нужен установленный runtime (обычный вариант в Docker-образе aspnet).
- Self-contained — runtime включён в вывод, больше размер.
- Single-file, trimming (удаление неиспользуемого кода), Native AOT (компиляция в нативный бинарник: быстрый старт, мало памяти, но ограничения на рефлексию).
Нюансы и подводные камни
- Разные версии одного пакета в разных проектах solution → конфликты при сборке (NU1605, MSB3277). Лечится Central Package Management.
TreatWarningsAsErrors+Nullableв общемDirectory.Build.props— дешёвый способ поднять качество кода во всех сервисах.- Смешение net8.0 и net9.0 в одном solution допустимо, но общие библиотеки должны быть совместимы по TFM.
bin/иobj/не коммитить,packages.lock.json— по желанию, для воспроизводимых сборок.
Вопросы с ответами
Чем .NET отличается от .NET Framework?
.NET (бывший Core) кроссплатформенный, open source, быстрее, с новыми версиями каждый год. .NET Framework работает только на Windows, находится на поддержке, новых фич нет.
Чем SDK отличается от runtime?
Runtime нужен для запуска приложения (CLR и библиотеки). SDK — для разработки: компилятор, MSBuild, CLI, шаблоны. SDK включает runtime.
Что такое сборка и что в ней хранится?
Результат компиляции проекта (dll или exe): IL-код, метаданные типов, манифест с версией и зависимостями. Единица развёртывания и границы видимости internal.
Как управлять общими настройками и версиями пакетов в большом solution?
Directory.Build.props для общих свойств (LangVersion, Nullable, анализаторы) и Directory.Packages.props (Central Package Management) для единых версий NuGet.
Что такое LTS и почему это важно?
Long Term Support: чётные версии .NET (8, 10) поддерживаются 3 года. Для продакшена чаще выбирают LTS, чтобы реже мигрировать.
Связанные темы
- Следующая: Типы: value и reference, struct и class, CTS
- CLR, JIT, AOT: CLR, IL, JIT, AOT, tiered compilation
- Multi-stage build для .NET: 2.5 Multi-stage build для .NET и Vue-Quasar, базовые образы
- Общий код между сервисами (NuGet): Общий код между сервисами: shared kernel, NuGet-пакеты, базовые образы
- Что нового в C# и .NET: [[be-2-1-12-chto-novogo-v-csharp-10-13|Что нового в C# 10–13 и .NET 8–9]]