Платформа .NET: SDK, runtime, версии, сборки, NuGet, solution и csproj

↑ 1.3 C♯: основы языка · → Следующая

Обязательно~5 мин чтенияУровень: junior

Зачем это на собесе

базовые вопросы любого .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 — по желанию, для воспроизводимых сборок.

Вопросы с ответами

Связанные темы