dotnet new,build,runvetestkomutlarını kullanmak- SDK tarzı bir
.csprojdosyasını okumak ve bir solution içinde proje başvuruları kurmak - Bir NuGet paketi eklemek ve nerede saklandığını açıklamak
C# kursunda her program, .NET 10'un bir özelliği sayesinde dotnet run app.cs ile çalışan tek bir app.cs dosyasıydı. Gerçek bir uygulama ise birkaç projeden oluşur: iş mantığını içeren bir kütüphane, onu kullanan bir konsol ya da web uygulaması ve testler. Bunları oluşturmak, birbirine bağlamak, derlemek ve dış paketler eklemek için .NET CLI, yani dotnet komutu vardır. Windows, macOS ve Linux'ta aynı şekilde çalışır.
.NET CLI'ın temel komutları
| Komut | Ne yapar |
|---|---|
dotnet new list | mevcut şablonları listeler |
dotnet new console -n Hello | Hello adlı bir konsol projesi oluşturur |
dotnet build | projeyi derler (bin/ ve obj/ klasörlerine) |
dotnet run | derler ve hemen çalıştırır |
dotnet test | test projelerini çalıştırır |
dotnet add package X | bir NuGet paketi ekler |
dotnet publish -c Release | sunucu ya da kullanıcılar için dağıtıma hazır bir sürüm derler |
dotnet --info | kurulu SDK'ları ve çalışma zamanlarını gösterir |
dotnet new console -n Hello
cd Hello
dotnet runThe template "Console App" was created successfully. ... Restore succeeded. Hello, World!
Bir projenin kalbi **.csproj dosyasıdır: MSBuild biçiminde bir XML. Modern SDK tarzı** dosyada yalnızca önemli olanlar yazılır: TargetFramework (net10.0), ImplicitUsings (sık gereken using yönergelerini otomatik ekler) ve Nullable (null hatalarıyla ilgili uyarılar). Klasördeki tüm .cs dosyaları otomatik olarak dahil edilir. Eski .NET Framework projelerinde ise her dosyanın ayrı ayrı yazılması gerekirdi:
<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: birden çok proje bir arada
Bir solution (çözüm), birbiriyle ilişkili projeleri gruplayan bir dosyadır; .NET 10'da varsayılan olarak yeni ve derli toplu .slnx biçiminde oluşturulur (eski .sln de çalışır). Tipik yapı: Gradebook.Core — hiçbir şeye bağlı olmayan bir kütüphane, Gradebook.App — onu çağıran bir konsol programı, Gradebook.Tests — xUnit testleri. Proje başvurusu (ProjectReference), bir projenin diğerinin sınıflarını görmesini sağlar.
- 1Solution'ı ve projeleri oluştur
dotnet new sln -n Gradebook, ardındanclasslib,consolevexunitşablonlarından üç proje. - 2Projeleri solution'a ekle
dotnet sln add ...: artık IDE vedotnet buildüç projeyi birlikte görür. - 3Başvuruları kur
dotnet add Gradebook.App reference Gradebook.Coreve testler için aynı komut. Başvuru tek yönlüdür: Core, App'i görmez. - 4Derle, çalıştır, test et
Solution klasöründe
dotnet buildher şeyi derler,dotnet run --project Gradebook.Appkonsol uygulamasını başlatır,dotnet testise testleri çalıştırır.
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 ve üç proje klasörü oluşurnamespace 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 — kütüphanedeki bir sınıf (başka bir projenin görebilmesi için public olmalı)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 ile çalıştırıldıNuGet paketleri
NuGet, .NET'in paket yöneticisidir; nuget.org ise yüz binlerce hazır kütüphanenin deposudur (Java'daki Maven Central gibi). dotnet add package Humanizer en son sürümü .csproj dosyasına bir PackageReference olarak yazar; .NET 10'da aynı işi yeni tarzdaki dotnet package add Humanizer de yapar. dotnet build ya da dotnet restore paketleri indirir ve kullanıcı klasöründeki ortak önbellekte (~/.nuget/packages) saklar; dotnet list package --outdated ise eskimiş paketleri gösterir.
using Humanizer;
Console.WriteLine("score".ToQuantity(1));
Console.WriteLine("score".ToQuantity(3));
Console.WriteLine("student".ToQuantity(12));1 score 3 scores 12 students
Bitmiş bir programı paylaşmak için dotnet publish kullan: .NET 8'den beri varsayılan olarak kodu iyileştiren Release yapılandırmasında derler (dotnet build ise hata ayıklama için tasarlanmış Debug kipindedir). -r win-x64 --self-contained eklersen sonuç, .NET kurulu olmayan bir bilgisayarda bile çalışan bağımsız bir klasör olur. Ekipteki herkesin aynı SDK sürümüyle çalışması için deponun köküne bir global.json dosyası konur; onu dotnet new globaljson oluşturur.
Önemli noktalar
dotnet new,build,run,test,publish: bir projenin tüm yaşamı için tek bir CLI.- SDK tarzı
.csproj:TargetFramework,ImplicitUsings,Nullable;.csdosyaları otomatik olarak dahil edilir. - Solution (
.slnx) projeleri gruplar,ProjectReferenceise onları tek yönde bağlar. - NuGet:
dotnet add package→PackageReference; paketler~/.nuget/packagesönbelleğinde tutulur. - Birden çok proje varsa
dotnet run --project ...yaz;bin/veobj/Git'e gitmez.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.