1. Ana Sayfa
  2. ASP.Net
  3. .NET Framework Compatibility Diagnostics Nedir?

.NET Framework Compatibility Diagnostics Nedir?

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 yazalım.


Resim-4: Microsoft.DotNet.FrameworkCompatibilityDiagnostics package

Paketi yükledikten sonra Solution Explorer’da 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ı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

www.mshowto.org

 

TAGs : .NET Framework Compatibility Diagnostics, , , , , , , FrameworkCompatibilityDiagnostics, dotnet_compatibility.json

Yorum Yap

Yazar Hakkında

Mert Yeter, lisans eğitimini Yıldız Teknik Üniversitesi Gemi İnşaatı Mühendisliği bölümünde, yüksek lisans eğitimini ise Bahçeşehir Üniversitesi Bilgi Teknolojileri bölümü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. Şu anda da Done'de Cloud Development Manager olarak Azure, .NET Core, SQL Server, Docker vb güncel teknolojiler üzerinde çalışmaktadır.

Yorum Yap