0

.NET Framework Compatibility Diagnostics Nedir? .NET Framework düzenli olarak güncellenmeye, yeni versiyonları çıkmaya başladı. Neredeyse hızına yetişemez hale geldi. Doğal olarak da belirli bir süre sonra da Microsoft eski sürümlere destek vermeyi sonlandırıyor. Biz de haliyle Framework güncellemesi yapmak zorunda kalabiliyoruz. Tabi burada kodlarımızı her zaman yeni versiyonla gelen özelliklerle refactor etmek kolay bir iş olmadığı için genelde sadece Target Framework değişikliğine gidiyoruz. Compile Time’da hata vermemesi runTime’da da hata vermeyeceği anlamına gelmediği için, sürprizlerle karşılaşmamak için kodlarımızı test etmemiz şart.

Olası bir Framework güncellemesi sadece runTime’da nasıl bir hataya yol açabilir diyorsanız, bir hata örneği ve bu hatayı Compile Time’da nasıl yakalayacağımızı görelim.

Resim-1‘de gördüğünüz List<T>.ForEach methodu, https://msdn.microsoft.com/en-us/library/bwabdf9z adresinden de görebileceğiniz üzere Collection içerisindeki bir element modifiye edildiği zaman InvalidOperationException fırlatıyor. Ancak buradaki önemli kısım bu Exception’ı fırlatmaya .NET 4.5 ile birlikte başlamış olması. Özetle .NET 4.0’da Collection’ı modifiye etseniz bile herhangi bir Exception almıyorsunuz.


Resim-1: List<T>.ForEach methodu

Kodumuzu .NET Framework 4.0’da derleyip çalıştırdığımızda Resim-2‘de göreceğiniz sonucu veriyor.


Resim-2: .NET 4.0 çıktısı

Şimdi de aynı kodu .NET 4.6.2 ile derleyip çalıştıralım. MSDN’deki uyarıyı okumamış olsaydık Compile Time’da bir hata almadığımız için problem olmadığını düşünebilirdik, ama maalesef runTime’da InvalidOperationException aldık.


Resim-3: .NET 4.5 InvalidOperationException

Peki bu gibi bir durumda her method için tek tek MSDN üzerinden araştırma yapmak ya da uçtan uca test etmek dışında ne yapabiliriz?

NOT: Az sonra okuyacaklarınız Roslyn kullandığı için min. VS2015 Update 1 gerektirmektedir.

Projemizi tekrar .NET Framework 4.0’a çektikten sonra Nuget Package Manager’ı açıp arama kısmına FrameworkCompatibilityDiagnostics yazalım.


Resim-4: Microsoft.DotNet.FrameworkCompatibilityDiagnostics package

Paketi yükledikten sonra Solution Explorer’da dotnet_compatibility.json adında bir dosya oluştuğunu göreceksiniz. Bu dosyada mevcut ve planlanan Framework versiyonu ile ilgili ayarları yapabiliyorsunuz. TargetFramework ve RunTimeFramework olarak 2 farklı Konfigurasyon mevcut.

Retargeting işlemi uygulamayı yeni Framework ile derlemek iken, runTime değişimi ise önceki versiyonda derlenmiş ancak daha sonraki bir versiyonda çalışması anlamına geliyor.

Örneğimiz Retargeting kategorisinde olduğu için; Resim-5‘te göreceğiniz gibi Target Framework için planlanan değeri 4.6.2 olarak değiştiriyoruz.


Resim-5: dotnet_compatibility.json

Projemizi tekrar derliyoruz ve… Bu Analyzer Warning’leri de nereden çıktı? Hepsi de InvalidOperationException (bir yerden tanıdık geliyor mu? J).
Mesajda “Feature ‘IOperation’ is disabled” diyor.


Resim-6: Feature ‘IOperation’ is disabled

Sorunla ilgili internette kısa bir araştırma yaptıktan sonra https://david.gardiner.net.au/2016/08/error-ad0001-Compiler-analyzer-threw.html adresinde yer alan çözümü denedim, fakat çok da başarılı olamadım.

NOT: Manual yöntem yerine powershell tercih eder ve “execution of scripts is disabled on this system” şeklinde bir hata alırsanız “powershell -ExecutionPolicy ByPass -File script.ps1” şeklinde çalıştırabilirsiniz.

Bir süre daha araştırdıktan sonra benzer öneriler dışında bir çözüm bulamayınca, nereden geldiyse package’ı downgrade etmek fikri aklıma geldi ve 0.4.2 versiyonunu yükledim. Bu sırada dotnet_compatibility.json dosyasını overwrite uyarısına benim gibi gaza gelip “Yes” demeyin J

0.4.2 versiyonu ile projeyi derlediğimde ise görmek istediğim sonucu Resim-7‘de göreceğiniz gibi warning olarak görebiliyorum. N-1 versiyon ilerlemek her zaman en iyisi diyenlere artık daha olumlu yaklaşacağım.


Resim-7: List<T> mutation detected

CD0005 ile ilgili detaylara https://msdn.microsoft.com/en-us/library/mt661864(v=vs.110).aspx adresindeki 5. maddeden ulaşabilirsiniz.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

 

TAGs : .NET Framework Compatibility Diagnostics, .NET Framework Compatibility Diagnostics nedir, .NET Framework Compatibility Diagnostics kullanimi, .NET Framework Compatibility Diagnostics compile time, .NET Framework Compatibility Diagnostics runtime, .NET Framework Compatibility Diagnostics hata, .NET Framework Compatibility Diagnostics error, FrameworkCompatibilityDiagnostics, dotnet_compatibility.json

Bu İçeriğe Tepkin Ne Oldu?
  • 0
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Mert Yeter, lisans eğitimini Yıldız Teknik Üniversitesi'nde, yüksek lisans eğitimini ise Bahçeşehir Üniversitesi'nde tamamlamıştır. Yazılım dünyasına üniversitenin ilk yıllarında aldığı QBasic ile başlayan Mert, .NET ve SQL Server gibi Microsoft teknolojileri ile devam etmiş; yüksek lisans tezini ise Linux konusunda yapmıştır. Netaş ve Ziraat Teknoloji gibi sektörün önde gelen firmalarında C#, .NET, SQL Server, Cisco Contact Center ürünleri ve Linux üzerine çalışmış, bir çok firmaya da bu konularda danışmanlık vermiştir.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

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