Установка 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 поднимает рабочий сервер. Дальше разберём, из чего состоит созданный проект.