- Пользоваться командами
dotnet new,build,runиtest - Читать
.csprojв стиле SDK и настраивать ссылки на проекты в решении - Добавлять пакет NuGet и объяснять, где он хранится
В курсе C# каждая программа была одним файлом app.cs, который благодаря возможности .NET 10 запускался командой dotnet run app.cs. Настоящее приложение состоит из нескольких проектов: библиотеки с бизнес-логикой, консольного или веб-приложения, которое её использует, и тестов. Чтобы создавать их, связывать, собирать и подключать внешние пакеты, существует .NET CLI — команда dotnet. Она одинаково работает в Windows, macOS и Linux.
Основные команды .NET CLI
| Команда | Что делает |
|---|---|
dotnet new list | показывает доступные шаблоны |
dotnet new console -n Hello | создаёт консольный проект Hello |
dotnet build | компилирует проект (в папки bin/ и obj/) |
dotnet run | собирает и сразу запускает |
dotnet test | запускает тестовые проекты |
dotnet add package X | добавляет пакет NuGet |
dotnet publish -c Release | собирает готовую версию для сервера или пользователей |
dotnet --info | показывает установленные SDK и среды выполнения |
dotnet new console -n Hello
cd Hello
dotnet runThe template "Console App" was created successfully. ... Restore succeeded. Hello, World!
Сердце проекта — файл **.csproj, XML в формате MSBuild. В современном файле в стиле SDK** записано только важное: TargetFramework (net10.0), ImplicitUsings (автоматически добавляет часто нужные директивы using) и Nullable (предупреждения об ошибках с null). Все файлы .cs из папки включаются автоматически. В старых проектах .NET Framework каждый файл приходилось перечислять отдельно:
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Student.cs" />
<Compile Include="GradeCalculator.cs" />
<!-- every new file had to be listed here -->
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project><Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Gradebook.Core\Gradebook.Core.csproj" />
<PackageReference Include="Humanizer" Version="2.14.1" />
</ItemGroup>
</Project>Решение: несколько проектов вместе
Решение (solution) — файл, который объединяет связанные проекты; в .NET 10 он по умолчанию создаётся в новом компактном формате .slnx (старый .sln тоже работает). Типичная структура: Gradebook.Core — библиотека, ни от чего не зависящая, Gradebook.App — консольная программа, которая её вызывает, Gradebook.Tests — тесты на xUnit. Ссылка на проект (ProjectReference) позволяет одному проекту видеть классы другого.
- 1Создай решение и проекты
dotnet new sln -n Gradebook, затем три проекта из шаблоновclasslib,consoleиxunit. - 2Добавь проекты в решение
dotnet sln add ...— теперь IDE иdotnet buildвидят все три проекта вместе. - 3Настрой ссылки
dotnet add Gradebook.App reference Gradebook.Coreи та же команда для тестов. Ссылка односторонняя: Core не видит App. - 4Собери, запусти, протестируй
В папке решения
dotnet buildсобирает всё,dotnet run --project Gradebook.Appзапускает консольное приложение, аdotnet test— тесты.
dotnet new sln -n Gradebook
dotnet new classlib -n Gradebook.Core
dotnet new console -n Gradebook.App
dotnet new xunit -n Gradebook.Tests
dotnet sln add Gradebook.Core Gradebook.App Gradebook.Tests
dotnet add Gradebook.App reference Gradebook.Core
dotnet add Gradebook.Tests reference Gradebook.CoreGradebook.slnx и три папки проектовnamespace Gradebook.Core;
public static class GradeCalculator
{
public static double Average(IEnumerable<int> scores)
{
var list = scores.ToList();
if (list.Count == 0) throw new ArgumentException("No scores");
return list.Average();
}
public static string Letter(int score) => score switch
{
< 0 or > 100 => throw new ArgumentOutOfRangeException(nameof(score)),
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 50 => "D",
_ => "F"
};
}Gradebook.Core/GradeCalculator.cs — класс в библиотеке (он должен быть public, чтобы другой проект его видел)using System.Globalization;
using Gradebook.Core;
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
int[] scores = [92, 78, 85];
double average = GradeCalculator.Average(scores);
Console.WriteLine($"Average: {average:F1}");
Console.WriteLine($"Letter: {GradeCalculator.Letter((int)average)}");Average: 85.0 Letter: B
Gradebook.App/Program.cs, запуск командой dotnet run --project Gradebook.AppПакеты NuGet
NuGet — менеджер пакетов .NET, а nuget.org — хранилище сотен тысяч готовых библиотек (как Maven Central в Java). dotnet add package Humanizer записывает последнюю версию в .csproj как PackageReference; в .NET 10 то же самое делает и команда в новом стиле dotnet package add Humanizer. dotnet build или dotnet restore скачивает пакеты и хранит их в общем кэше в папке пользователя (~/.nuget/packages), а dotnet list package --outdated показывает устаревшие пакеты.
using Humanizer;
Console.WriteLine("score".ToQuantity(1));
Console.WriteLine("score".ToQuantity(3));
Console.WriteLine("student".ToQuantity(12));1 score 3 scores 12 students
Чтобы поделиться готовой программой, используй dotnet publish: начиная с .NET 8 он по умолчанию собирает в конфигурации Release, которая оптимизирует код (dotnet build работает в режиме Debug, предназначенном для отладки). Если добавить -r win-x64 --self-contained, получится самостоятельная папка, которая запускается даже на компьютере без установленного .NET. Чтобы вся команда работала с одной версией SDK, в корень репозитория кладут файл global.json — его создаёт dotnet new globaljson.
Главное
dotnet new,build,run,test,publish— один CLI на всю жизнь проекта..csprojв стиле SDK:TargetFramework,ImplicitUsings,Nullable; файлы.csвключаются автоматически.- Решение (
.slnx) объединяет проекты, аProjectReferenceсвязывает их в одном направлении. - NuGet:
dotnet add package→PackageReference; пакеты хранятся в кэше~/.nuget/packages. - Когда проектов несколько, пиши
dotnet run --project ...;bin/иobj/в Git не попадают.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.