.NET Framework’ten .NET 9'a Geçiş: Yolculuğun Adımları Nasıl Olabilir?

Kardel Rüveyda ÇETİN
7 min readJan 8, 2025

--

.NET Framework’ten .NET 9'a büyük bir kod tabanını taşımak, yalnızca teknik bir zorluk değil, aynı zamanda kapsamlı bir strateji ve uzun vadeli bir planlama süreci gerektiriyor. Bu tür bir geçiş, performansı artırma, daha iyi ölçeklenebilirlik sağlama ve modern geliştirme araçlarının sunduğu avantajlardan yararlanma hedefiyle oldukça cazip hale geliyor. Ancak, bu süreçte detaylı hazırlık yapmak, mevcut kod tabanının yapısını derinlemesine anlamak ve stratejik adımları dikkatlice planlamak büyük önem taşıyor. Her adımı özenle ve titizlilikle incelenmezse sanki bir noktada bu yolculuk hüsranla sonuçlanabilir. Bunu istemeyiz değil mi :D ?.

Bu makalede, kendi deneyimlerimden ve araştırmalarımdan yola çıkarak .NET Framework’ten .NET 9'a geçiş sürecine dair önemli notlarımı ve dikkat edilmesi gereken kritik noktaları paylaşacağım. Geçiş sırasında karşılaşılan zorlukları, bu zorluklarla başa çıkmak için izlenebilecek yöntemleri ve süreci kolaylaştıran araçları ele alacağım. Ayrıca, bu yolculuk boyunca faydalandığım kaynakları da makalenin sonunda bulabilirsiniz. Umarım bu makale benzer bir geçiş süreci planlayanlar için yol gösterici olabilir.

  • Tarihsel Bağlam: .Net Framework’ten .NET Core’a
  • .NET Standard’ın Kavranması
  • Breaking Changes ile Başa Çıkma: Shim Kullanımı
  • Paket Uyumluluğu İçin Araçlar
  • Desteklenmeyen Kütüphanelerle Başa Çıkma
  • Runtime Farklılıklarını Test Etme

Tarihsel Bağlam: .NET Framework’ten .NET Core’a

Geçmişi anlamadan geleceğe yolculuk etmek zor olur, bu sadece migration yolculuğunda değil, her yolculğa başlarken aynıdır. Dikkat ederseniz hep bir referans ararız, nasıl yapılmış? Ben nasıl yapabilirim?

NET Framework’ten modern .NET’e olan geçişi daha iyi kavramak için de bu platformun evrimini incelemek çok önemli. İlk başlarda, .NET Framework Windows tabanlı uygulamalar için en popüler standarttı diyebiliriz. Ancak, cross platform ihtiyacının gün geçtikçe artmasına istinaden Microsoft’un daha esnek bir framework olan .NET Core ile yollarımızın kesişmesine sebebiyet verdi, iyi ki de yollarımız kesişti ❤.

Bu adım ile birlikte .NET 5 ve sonrasında modern .NET adı altında tüm platformları birleştirerek geliştiriciler için yepyeni bir dönem başladı.

Evrim Süreci:

  • .NET Framework.NET Core.NET

Bu evrimin arkasındaki en büyük kolaylaştırıcı unsurlardan biri, .NET Standard’dı [1]. .NET Standard, tüm .NET platformlarının desteklemesi gereken ortak bir API yüzeyi tanımlayarak, farklı platformlar arası uyumluluğu garanti altına alınmasını da sağladı.

Bu standart sayesinde geliştiriciler, hem .NET Framework hem de .NET Core ile çalışabilen kütüphaneler oluşturabildi. Bu da sadece bir platformdan diğerine geçişi kolaylaştırmakla kalmadı; aynı zamanda cross platform geliştirme sürecinde geliştiricilere esneklik sağladı.

.NET Standard’ın Kavranması

.NET Standard’ı anlamak, başarılı bir geçiş sürecinin temel taşlarından biridir. Bu standart .NET Framework ve .NET Core gibi farklı .NET platformlarının desteklemesi gereken ortak bir API yüzeyi sunmaktadır. Kısacası, geliştiricilere farklı platformlarda çalışabilen kütüphaneler oluşturma imkânı tanımaktadır.

Neden Önemlidir?

.NET Standard, bir platformdan diğerine geçiş yaparken yaşanabilecek uyumluluk sorunlarının önünü kesebilmektedir. Kodunuzun sadece tek bir platforma bağlı kalmasını önler ve farklı .NET platformları arasında daha sorunsuz bir entegrasyon sağlar.

Pratik Uygulama:

Kod tabanınızı yükseltirken, bağımlı olduğunuz tüm kütüphanelerin .NET Standard ile uyumlu olduğundan emin olmanız önemlidir.

Bu sayede;

  • Breaking Changes’i Azaltır: Kodda minimum değişiklikle geçiş yapmanızı sağlayabilirsiniz.
  • Çapraz Platform Uyumluluğu: Kod tabanınızın hem .NET Framework 4.8 hem de .NET Core 2.1'ü desteklemesini gerçekleştirebilirsiniz.

Breaking Changes ile Başa Çıkma: Shim Kullanımı

Geçiş sürecinde karşılaşılan en büyük zorluklardan biri, “breaking changes” olarak bilinen API uyumsuzluklarıdır. Framework veya kütüphanelerdeki API’lerin değişikliğe uğramasıyla ortaya çıkan bu sorunlar kodunuzun mevcut haliyle yeni sürümlerle uyumlu olmamasına neden olabilir. [2][3][4]

Çözüm: Shim Kullanımı

Shim, eski API çağrılarını yeni API’lere çeviren bir ara katmandır. Bu katman sayesinde, kodunuzda anında büyük değişiklikler yapmaya gerek kalmadan geçiş sürecini başlatabilirsiniz. Shim’ler, mevcut fonksiyonelliği koruyarak daha planlı bir geçiş yapmanıza olanak tanır. [5][6]

Örnek:

Nancy framework’ünün 1.x sürümlerinden 2.0'a geçerken rota tanımlarında önemli değişiklikler oldu. Bu durumda, bir shim oluşturularak eski kodun çalışabilirliği korundu ve yeni sürümle uyum sağlandığını düşünün.

Shim Kullanımının Avantajları ile birlikte:

  • Mevcut Fonksiyonelliği Koruyabilirsiniz: Kodunuzdaki çekirdek özelliklerin bozulmasını engelleyebilirsiniz.
  • Aşamalı Geçiş Sağlayabilirsiniz: Tüm sorunları tek seferde değil, parça parça ele almanıza olanak sağlamış olursunuz.
  • Kesintisiz Süreç: Geçişinizi daha az aksama ile tamamlamanızı sağlayabilirsiniz.

Paket Uyumluluğu İçin Araçlar

Geçiş sürecinde paket uyumluluğu konusunu anlamak, sürecin sorunsuz ilerlemesi için hayati önem taşır. Bu konuda yardımcı olacak birçok araç mevcuttur.

Tavsiye Edilen Araçlar da vardır tabii ki;

  1. Porting Assistant for .NET (AWS): Mevcut kütüphanelerin uyumluluğunu analiz eder ve alternatifler sunabilir. Bu araç, kütüphanelerin hangi platformlarla uyumlu olduğunu görüp sorunlu alanları tespit etmenize yardımcı olabilir. [8]
  2. .NET Upgrade Assistant: Projelerinizi nasıl etkili bir şekilde yükseltmeniz gerektiği konusunda rehberlik edebilir. Geçiş yaparken izlenmesi gereken adımları netleştirir ve hızlı bir plan sunabilir ( ama tabii çok hızlı değil,sabır önemli :) ) [9]

Bu araçlar, geçiş sürecinde sizin en büyük yardımcılarınız olabilir. Uyumsuz kütüphaneleri hızla tespit ederek zamandan tasarruf sağlamanız, güncellemelerinizi daha düzenli ve verimli bir şekilde yapmanız için yol gösterici olabilir. Ayrıca, karşılaştığınız sorunlu alanlara yönelik alternatif çözümler sunarak, süreci daha akıcı hale getirmenizi sağlayabilir.

Desteklenmeyen Kütüphanelerle Başa Çıkma

Geçiş sürecinde desteklenmeyen kütüphanelerle karşılaşmak, en yaygın zorluklardan biridir. Yani bu sorun için kütüphane sahibine yazdığımı biliyorum. :D Güncellenen sürümle destekli sürüm gelecek mi ? Biz geliştirelim, PR’a bakabilir misiniz diye diye darladığım zamanı biliyorum. Yanıt alamadım tabii. Bu makaleye yolu düşerse o kendini bilecektir. Ki belirtmek isterim, biraz kırılmıştım…

Peki sizin stratejileriniz nasıl olmalı?

Topluluk Destekli Forklar Çoğu zaman, popüler kütüphanelerin topluluk tarafından güncellenmiş sürümleri bulunur. Bu güncellemeler genellikle .NET Standard veya modern .NET sürümleriyle uyumluluk sağlar. Örneğin: Entity Framework gibi yaygın kütüphaneler için topluluk tabanlı çözümler bulunabilir. Star sayısı ve contributor da önemli bir kısıt bence. Bunlara da dikkat etmek gerekiyor. Kullandığınız pakete ne kadar issue açılmış? Ne kadarı cevaplanmış? Yani kullandığınız paket yaşıyor mu? Bunlara dikkat etmek gerekiyor. Yoksa aksi takdirde bu sorunlarla karşılaşmanız çok dğoal.

Tabii bir seçenek olarak desteklenmeyen bir kütüphane açık kaynaklıysa, kendi versiyonunuzu fork ederek gerekli güncellemeleri yapabilirsiniz. Ama bu güncellemelerin de onaylanması gerektiğini unutmayalım. :)

Alternatifleri Keşfedin Eğer mevcut kütüphane modern platformlarda desteklenmiyorsa, benzer işlevsellik sunan alternatif kütüphaneleri araştırın.

  • Örneğin: Newtonsoft.Json yerine System.Text.Json kullanılabilir.
  • Kod tabanınızda bazı uyarlamalar yapmanız gerekebilir ancak bu yöntem genellikle daha uzun vadeli bir çözüm sunar.

Adapter Katmanı Oluşturun Mevcut kodunuz ile yeni kütüphane arasında bir adaptör katmanı oluşturarak entegrasyonu kolaylaştırabilirsiniz. Bu yöntem, eski API çağrılarını yeni kütüphane API’lerine dönüştürmeyi sağlar.

  • Örnek: Eski bir serileştirme kütüphanesinden System.Text.Json’a geçerken bir adapter oluşturarak kademeli geçiş yapabilirsiniz.

Bu stratejilerle, geçiş sürecindeki desteklenmeyen kütüphane problemlerini etkili bir şekilde yönetebilirsiniz. Doğru yöntemi seçmek, hem zaman hem de kaynakları verimli kullanmanıza yardımcı olur.

Runtime Farklılıklarını Test Etme

.NET Framework ile .NET Core arasındaki farklılıklar, özellikle serileştirme gibi hassas işlemlerde sorunlara neden olabilir. Örneğin, Newtonsoft.Json gibi yaygın bir aracı kullanıyorsanız, farklı framework sürümleri arasında serileştirme ve deserializasyon problemleriyle karşılaşabilirsiniz. Bu tür sorunlar, veri bütünlüğünü tehdit edebilir ve hızla çözülmesi gerekir.

Kapsamlı Testler Yapın:

  • Tüm serileştirme işlemlerinizi farklı framework sürümlerinde kapsamılı bir şekilde test edin.
  • Test sürecinde, veri kaybı veya bozulma olup olmadığını kontrol edin.
  • Hem eski hem de yeni framework sürümlerinde aynı veri bütünlüğünü sağladığınızdan emin olun.

Alternatif Araçları Değerlendirin:

  • Newtonsoft.Json yerine System.Text.Json gibi daha modern ve performanslı alternatiflere geçişi düşünün.
  • Alternatiflere geçerken, adaptör veya shim katmanı oluşturarak mevcut kodunuzu koruyabilirsiniz.

Test Verilerini Yedekleyin:

  • Test süreci boyunca, gerçek dünya verilerinizi yedekleyerek çalışın. Bu, beklenmedik sorunlarla karşılaştığınızda eski verilere geri dönmenizi sağlar.

Sürümler Arasında Geçiş

Kod tabanınızı yükseltirken, kopmaları ve uyumluluk sorunlarını en aza indirmek için aşamalı bir yaklaşım izlemek önerilir. Bu yöntem, geçiş sürecini daha kontrollü ve güvenli hale getirir.

Adımlar:

.NET Core 2.1'a Stabil Hale Getirin:

  • Kod tabanınızı öncelikle .NET Core 2.1'a güncelleyin ve burada stabil hale getirin.
  • Bu sürümde, tüm bağımlılıklarınızı kontrol ederek uyumluluğu doğrulayın.

Aşamalı Olarak Daha Yüksek Sürümlere Geçin:

  • Eğer kod tabanınız stabil hale geldiyse, adım adım .NET 5, .NET 6 ve sonrasına geçiş yapın.
  • Her geçişte breaking changes için gerekli testleri yaparak sorunları erken tespit edin.

Doğrudan Son Sürümü Hedeflemeyin:

  • En son sürüme doğrudan geçmek cazip gelse de, bu yöntem beklenmeyen sorunlara yol açabilir. Biliyorum, bir an evvel o an gelsin istiyorsunuz ama “bilama” sabır.
  • Kademeli geçiş, her aşamada breaking changes’i ele almanıza yardımcı olur ve daha az kesinti ile sonuca ulaşmanızı sağlar.

Bu yaklaşımla, kod tabanınızın modern .NET sürümleriyle uyumlu hale gelmesini daha güvenli bir şekilde sağlayabilirsiniz.

Bu süreç, doğru planlama, sabır ve etkili araç kullanımının uzun vadeli hedeflere ulaşmak için ne kadar kritik olduğunu gösteriyor. Aslında bu durum, hayatın diğer alanlarında olduğu gibi düzenli ve temiz bir sonuç elde etmek istiyorsak iyi bir planlama yapmamızın gerekliliğine de işaret ediyor.

Doğru bir plan yapıp bu planın rehberliğinde ilerlediğimizde, işlerimizin daha sorunsuz ve verimli şekilde yürüeceği açıktır. Ancak, şunu da unutmamak gerek:

"Life is what happens to you when you're busy making other plans."

Hayatın planlarımıza müdahale edebileciğini kabul ederek, esnek olmalı ve bu süreci bir öğrenme fırsatı olarak görmeliyiz. Çünkü her aşamada karşımıza belki de farklı bir sorun çıkacak ve mücadele ettikçe yeni şeyler öğreneceğiz…

Sevgiler,

Kaynakça

[1] .NET Standard- https://learn.microsoft.com/tr-tr/dotnet/standard/net-standard?tabs=net-standard-1-0

[2] What is Breaking Changes? — https://stackoverflow.com/questions/21703216/what-is-a-breaking-change-in-software

[3] What Are Breaking Changes and How Do You Avoid Them? — https://nordicapis.com/what-are-breaking-changes-and-how-do-you-avoid-them/

[4] Breaking Changes — https://docs.github.com/en/rest/about-the-rest-api/breaking-changes

[5] How do you remove 3rd party library? Create a SHIM! — https://www.youtube.com/watch?v=KcYO5Jm4EXU

[6] What is a Shim? A Guide to Using Shims Effectively — https://www.mrhandyman.com/blog/2020/august/what-is-a-shim-and-how-do-you-use-it-/

[7] What is a Shim? — https://stackoverflow.com/questions/2116142/what-is-a-shim

[8] Porting Assistant for .NET — https://aws.amazon.com/tr/porting-assistant-dotnet/

[9] .NET Upgrade Assistant — https://dotnet.microsoft.com/en-us/platform/upgrade-assistant

[10] .NET Framework Migration to .NET9- https://codeopinion.com/net-framework-migration-to-net9/

--

--

Kardel Rüveyda ÇETİN
Kardel Rüveyda ÇETİN

Written by Kardel Rüveyda ÇETİN

Software Development Lead @DogusTeknoloji | Microsoft MVP | Mathematical Engineer | Speaker | Blogger | Founder&Organizer @thecoderverse

No responses yet