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.

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!
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ığı:
#packageile, 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ı
#packagesatı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
- Microsoft Docs – C# Script
- Hobimiz Teknoloji: C# Proje Dosyalarına Elveda mı?
- Microsoft’s Linux-friendly approach to C# scripting is planned for .NET 10
- Running C# without csproj files

Faydalı içerik. Çok teşekkürler
Teşekkür ederim Fatih.