Установка SDK и первый проект

Установка .NET SDK, первый проект через CLI и понимание разницы между SDK и runtime.

Суть: чтобы писать на ASP.NET Core, нужен .NET SDK — набор инструментов для создания, сборки и запуска проектов. Главная команда — dotnet: ей создают проекты, добавляют пакеты, запускают приложение.

В отличие от языков, где «просто пиши .py и запускай», в мире .NET есть понятие проекта и инструментов сборки. Но пугаться не нужно: всё делается одной утилитой dotnet из терминала, и работает она одинаково на Windows, Linux и macOS.

SDK против runtime

Разделение важно понять с самого начала. Runtime — это то, что нужно, чтобы запустить уже готовое .NET-приложение (как «плеер» для скомпилированного кода). SDK — это всё, что нужно, чтобы разрабатывать: компилятор, шаблоны проектов, CLI. SDK включает в себя runtime. На машине разработчика ставят SDK, на сервере в проде иногда достаточно runtime.

SDK (для разработки)
 +-- компилятор C#
 +-- CLI (dotnet)
 +-- шаблоны проектов
 +-- Runtime (для запуска)
      +-- виртуальная машина .NET (CLR)
      +-- стандартные библиотеки

Установка и проверка

Скачайте .NET 8 SDK с официального сайта Microsoft (dotnet.microsoft.com) и проверьте установку:

dotnet --version
dotnet --list-sdks

Если версия вывелась — всё готово. Теперь создадим первый веб-API одной командой:

dotnet new webapi -o MyApi
cd MyApi
dotnet run

Шаблон webapi создаёт минимальный веб-API, -o MyApi — папка проекта, dotnet run компилирует и запускает. В консоли появится адрес вроде http://localhost:5xxx — это уже работающий сервер.

Как работает под капотом

Команда dotnet run делает несколько шагов: восстанавливает зависимости (NuGet-пакеты), компилирует ваш C#-код в промежуточный язык IL, и запускает приложение в среде CLR (Common Language Runtime). CLR на лету превращает IL в машинный код через JIT-компиляцию. Поэтому первый запуск чуть медленнее — идёт прогрев.

Частые ошибки

  • Поставили только runtime, а не SDK. Тогда dotnet new не работает — нет шаблонов. Нужен именно SDK.
  • Несколько версий SDK и путаница. Файл global.json в корне проекта может зафиксировать нужную версию SDK.
  • Забыли dotnet restore на чистой машине. Обычно run/build делают restore автоматически, но в CI его иногда вызывают явно.

Best practices

  • Используйте dotnet new list, чтобы посмотреть доступные шаблоны (webapi, console, classlib, mvc).
  • Не коммитьте папки bin/ и obj/ — это артефакты сборки. Добавьте их в .gitignore.
  • Для команд держите под рукой dotnet --help и dotnet [команда] --help.

Из чего собирается приложение: путь от исходника до запуска

Полезно представлять полную картину сборки. Ваш C#-код компилятор Roslyn превращает в IL (Intermediate Language) — платформенно-независимый байт-код, который кладётся в сборку (.dll). При запуске среда CLR загружает эту сборку, а JIT-компилятор переводит IL в машинный код под конкретный процессор — лениво, по мере вызова методов. Поэтому первый вызов «горячего» пути чуть медленнее, а дальше код работает на нативной скорости.

Для прода существует и AOT-компиляция (Native AOT): код заранее компилируется в нативный бинарник, что даёт быстрый старт и маленький объём памяти — это удобно для serverless и микросервисов. Для обучения вам это не понадобится, но знать о существовании полезно: .NET даёт выбор между гибким JIT и быстрым стартом AOT.

Полезные команды CLI и устройство NuGet

Кроме new, build и run, в повседневной работе пригодятся: dotnet add package (добавить зависимость), dotnet test (прогнать тесты), dotnet publish (собрать релизный артефакт для деплоя), dotnet watch (горячая перезагрузка при изменении кода). Последняя особенно удобна в разработке: меняете эндпоинт — приложение пересобирается и перезапускается само.

NuGet — это менеджер пакетов .NET, аналог npm или pip. Зависимости описываются в .csproj, а их версии фиксируются, чтобы сборка была воспроизводимой на любой машине и в CI. При restore CLI скачивает пакеты в локальный кэш. Важно понимать: пакеты — это чужой код в вашем приложении, поэтому в боевых проектах за их версиями и уязвимостями следят (например через dotnet list package --vulnerable).

Итог: SDK ставится один раз, проект создаётся одной командой, а dotnet run поднимает рабочий сервер. Дальше разберём, из чего состоит созданный проект.

Проверьте себя
1. В чём разница между .NET SDK и runtime?
AЭто одно и то же
BSDK нужен для запуска, runtime — для разработки
CSDK нужен для разработки и включает в себя runtime, который нужен для запуска
Druntime включает SDK
2. Какая команда создаёт новый веб-API проект?
Adotnet build webapi
Bdotnet new webapi -o MyApi
Cdotnet run webapi
Ddotnet create api