Giriş

.NET ekosisteminde uzun yıllardır yeni bir şeyler denemek, küçük bir araç veya test kodu yazmak isteyen herkesin yolu aynı engelden geçti: Bir proje oluşturmak, .csproj dosyası hazırlamak, NuGet paketlerini tanımlamak… Fakat .NET 10 ile birlikte, C# dünyasında “projesiz” bir çağ başladı. Sadece tek bir .cs dosyası ile, bağımlılıkları ve ortamı başında belirleyip, terminalden tek satırda çalışan kodlar yazabiliyoruz. Peki bu, sadece küçük scriptler için mi avantajlı? Büyük projeler için hâlâ .csproj’a ihtiyacımız var mı? Bütün detaylarıyla, pratik örnekler, gerçek senaryolar ve bol açıklamayla anlatıyorum.

projesiz_akisi

1. Klasik ve Modern Akış: Temel Kavramlar

1.1 Eskiden Nasıldı?

  • Klasik C#’ta yeni bir şey denemek için “dotnet new console” komutu ile bir proje açılırdı.
  • Tüm bağımlılıklar, paketler ve derleme ayarları .csproj dosyasında tutulurdu.
  • Kodun başlatılması, derlenmesi ve paylaşılması için proje dosyaları zorunluydu.

1.2 .NET 10 ile Neler Değişti?

  • Artık tek bir .cs dosyasıyla, projesiz doğrudan geliştirme mümkün.
  • Dosyanın başında, özel #package ve #sdk direktifleriyle hem bağımlılıkları hem de SDK versiyonunu tanımlayabiliyoruz.
  • Terminalde “dotnet run dosya.cs” komutuyla anında çalıştırma!

csproj-giris

2. #package ve #sdk Direktifleriyle Bağımlılık Yönetimi

2.1 #package Kullanımı

Script dosyasının en başında şu şekilde kullanılır:

#package "Newtonsoft.Json"
#package "Dapper, Version=2.0.123"
using Newtonsoft.Json;
using Dapper;
  • Çoklu paket desteği: Dilediğin kadar farklı paketi başa ekleyebilirsin.
  • Sürüm belirtme: Eğer belirli bir sürüm istiyorsan “, Version=…” eklersin.

2.2 #sdk Direktifi

Belirli bir SDK veya framework ile çalışmak istersen:

#sdk "Microsoft.NET.Sdk"
#sdk "Microsoft.NET.Sdk.Web" // Web API/script için
  • Özellikle farklı dotnet sürümlerinde deneme yapmak, farklı projelerle uyumluluk için faydalı.

3. Projesiz C# ile Geliştirme Senaryoları

3.1 Hızlı Komut Satırı Araçları

Tek dosyada, örneğin bir klasördeki tüm PNG dosyalarını zipleyip taşımak:

using System.IO.Compression;

var pngs = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.png");
using var archive = ZipFile.Open("tum_resimler.zip", ZipArchiveMode.Create);
foreach (var file in pngs)
    archive.CreateEntryFromFile(file, Path.GetFileName(file));
Console.WriteLine("Tüm PNG dosyaları sıkıştırıldı!");

Proje açmak, config dosyası yazmak, NuGet yönetimiyle uğraşmak yok!

3.2 Hızlı JSON İşleme ve API Tüketimi

#package "Newtonsoft.Json"
using System.Net.Http;
using Newtonsoft.Json;

var client = new HttpClient();
var data = await client.GetStringAsync("https://randomuser.me/api/");
dynamic user = JsonConvert.DeserializeObject(data);
Console.WriteLine($"İsim: {user.results[0].name.first} {user.results[0].name.last}");

Tek dosyada hızlı API entegrasyonu, ekstra ayar yok.

3.3 CLI ile Mini Oyun veya Eğitim Scripti

Console.WriteLine("Bir sayı tahmin et (1-10):");
var rnd = new Random();
int dogru = rnd.Next(1, 11);
int tahmin = int.Parse(Console.ReadLine()!);
if (tahmin == dogru)
    Console.WriteLine("Tebrikler, doğru tahmin!");
else
    Console.WriteLine($"Üzgünüm, doğru cevap: {dogru}");

Eğitim, kod denemeleri ve sunumlar için pratik.

3.4 Veritabanı Bağlantısı ve Kayıt İşlemleri

#package "System.Data.SQLite.Core"
using System.Data.SQLite;

var conn = new SQLiteConnection("Data Source=demo.db");
conn.Open();
var cmd = new SQLiteCommand("CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, text TEXT)", conn);
cmd.ExecuteNonQuery();
cmd = new SQLiteCommand("INSERT INTO notes (text) VALUES ('Merhaba, dünya!')", conn);
cmd.ExecuteNonQuery();
Console.WriteLine("Not eklendi!");

Hafif veritabanı işlemleri, ek projeye ihtiyaç olmadan!

4. Gerçek Dünya Kullanım Senaryoları

4.1 Data Science & Hızlı Veri Analizi

  • Excel veya CSV verisi okuyup istatistik çıkarmak için tek dosya script
  • Örneğin: Tüm .csv dosyalarını okuyup, sütun sayısını bulan script
using System.IO;

var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.csv");
foreach(var file in files)
{
    var lines = File.ReadAllLines(file);
    Console.WriteLine($"{Path.GetFileName(file)}: {lines.Length} satır");
}

4.2 Otomasyon ve Batch İşlemler

  • Klasördeki resimleri yeniden adlandırmak veya boyutlandırmak için küçük script’ler
  • Sunucuya otomatik yedekleme için gece çalışan mini kodlar

4.3 Eğitim, Demo ve Topluluk Paylaşımı

  • StackOverflow, blog, Github gibi ortamlarda paylaşılacak örnek kodlar
  • Sadece bir dosya, herkes kolayca kendi bilgisayarında çalıştırabiliyor

5. Projesiz ve Klasik C# Proje Akışının Karşılaştırılması

Özellik Projesiz C# (.NET 10+) Klasik Proje (.csproj)
Başlangıç Tek dosya ile Proje/solution zorunlu
Paket yönetimi #package ile baştan eklenir NuGet & .csproj ile
SDK ayarı #sdk ile .csproj’a eklenir
Derleme/Çalıştırma dotnet run dosya.cs dotnet run
Hedef Script, CLI, hızlı deneme Büyük uygulama, prod kod
Sürüm Yönetimi Script başında .csproj’da
Dosya Sayısı 1 Çoklu dosya
IDE Desteği Temel (VS Code, Rider) Gelişmiş (Visual Studio)

6. Avantajlar – Derinlemesine

  • Zamandan Tasarruf: Proje oluştur, ayar yap, NuGet config ile uğraş derdi yok.
  • Taşınabilirlik: Tek dosya, kopyala-yapıştır ile her yerde çalıştır.
  • Karmaşıklıktan Kurtuluş: Küçük işler için proje şişkinliği yok.
  • Bağımlılık Kolaylığı: #package ile, NuGet.org’dan anında indirip kullan.
  • Eğitimde Kolaylık: Öğrencilere, geliştiricilere “projesiz” hızlı deneme imkanı.
  • Geliştirici Deneyimi: Hızlı prototip ve hata ayıklama için birebir.

7. Dezavantajlar – Derinlemesine

  • Büyük Proje Yönetimi Zor: Script büyüdükçe takip ve bakım güçleşir.
  • Çoklu Dosya/Katman Eksikliği: Büyük projelerde modülerlik kaybolur.
  • IDE Entegrasyonu Sınırlı: Otomatik refactor, tam intellisense için .csproj şart.
  • CI/CD Uyumunda Eksiklik: Script tabanlı kodları pipeline’a entegre etmek daha karmaşık.
  • Yayınlama/Dağıtım: Paketleme, publish işlemleri için hâlâ klasik yol kullanılmalı.

8. Sık Yapılan Hatalar & İpuçları

  • #package satırında paket adı/sürümünü yanlış yazmak → derleme hatası alırsın.
  • Çoklu paket eklerken, sürüm çakışmasına dikkat et.
  • Script dosyasını gereğinden fazla büyütüp, bir “spaghetti code”a dönüştürmekten kaçın.
  • Üretim ortamı için, kritik işlerde script yerine klasik proje tercih et.
  • Script dosyanı, platform bağımsız çalışacak şekilde (örn. yol ayrımları) yazmaya dikkat et.

9. İleri Seviye Kod Örnekleri

9.1 Dış Servis ile Entegrasyon (Mail Gönderme)

#package "MailKit"
using MailKit.Net.Smtp;
using MimeKit;

var mesaj = new MimeMessage();
mesaj.From.Add(new MailboxAddress("Gönderen", "gonderen@site.com"));
mesaj.To.Add(new MailboxAddress("Alıcı", "alici@site.com"));
mesaj.Subject = "Test Mail";
mesaj.Body = new TextPart("plain") { Text = "Selamlar!" };

using var smtp = new SmtpClient();
smtp.Connect("smtp.site.com", 587, false);
smtp.Authenticate("kullanici", "sifre");
smtp.Send(mesaj);
smtp.Disconnect(true);

Console.WriteLine("E-posta gönderildi!");

9.2 Web Scraping (HTML’den Veri Çekme)

#package "HtmlAgilityPack"
using HtmlAgilityPack;

var web = new HtmlWeb();
var doc = web.Load("https://news.ycombinator.com/");
var basliklar = doc.DocumentNode.SelectNodes("//a[@class='storylink']");
foreach(var b in basliklar)
    Console.WriteLine(b.InnerText);

9.3 CSV’den JSON’a Dönüştürme

#package "CsvHelper"
#package "Newtonsoft.Json"
using System.IO;
using CsvHelper;
using Newtonsoft.Json;
using System.Globalization;

using var reader = new StreamReader("veri.csv");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
var kayitlar = csv.GetRecords<dynamic>().ToList();
var json = JsonConvert.SerializeObject(kayitlar, Formatting.Indented);
File.WriteAllText("veri.json", json);

Console.WriteLine("Dönüşüm tamamlandı!");

10. Sıkça Sorulan Sorular (SSS)

.csproj tamamen bitiyor mu?
Hayır, script ve hızlı prototip için devrim niteliğinde, ama büyük/karmaşık projede .csproj hâlâ şart.

Her platformda çalışır mı?
Evet, .NET 10 yüklü olan tüm platformlarda (Windows, Linux, Mac).

Birden fazla script dosyasını bir arada kullanabilir miyim?
Temel amaç tek dosya, ama include/import ile kısmi destek var. Büyük projede yine .csproj tercih edilmeli.

Paket çakışması olursa ne olur?
Doğrudan terminalde uyarı veya hata alırsın, paket/sürüm isimlerini kontrol et.

CLI aracı olarak dağıtabilir miyim?
Küçük script’lerde evet, fakat publish veya global araç için klasik proje yapısı önerilir.

11. Kaynaklar

By tanju.bozok

Software Architect, Developer, and Entrepreneur

2 thoughts on “.csproj Dosyasına Elveda mı? .NET 10 ile Yepyeni Kodlama Deneyimi”

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir