Bilindiği üzere .Net Framework v.3.5 çıkalı hayli zaman oluyor ve projelerimizi yavaş yavaş upgrade ediyoruz. Microsoft, geriye uyumluluk adına her zaman başarılı işler yapsa da bazen kodlarımız içinde ufak tefek güncellemeler yapmamız kaçınılmaz olabiliyor. Lafı dolandırmadan yaşadığım hadiseye ve çözümüne odaklanmak istiyorum.
Asp.Net 2.0 + Ajax 1.0 ile geliştirdiğim bir web projem var ve bu projeyi .net 3.5'a upgrade etmeye karar verdim. Upgrade süreci sorunsuz gerçekleşse de sayfayı test ettiğimde bazı kontrollerimin çalışmadığını farkettim. ( Modüler çalımayı seven birisi olarak, kendime özel kontroller (custom control) geliştiriyorum ve bunları farklı projelerde kullanıyorum. Kontrolleri .Net 2.0 ile yazmış ve derlemiştim. ) Sorunun ne olduğunu bulmak adına, proje referanslarımın geçerli olmayabileceğini düşündüm ve 2.0 ile 3.5 arasında hangi system assembly'lerinin sürümlerinin değiştiğini araştırdım. Sorun tam da buradan kaynaklanıyordu : Kontrollerim System.Web.Extensions (1.1.0.0) ve System.Web.Extensions.Design (1.1.0.0)'e karşı derlenmişti; oysa .net 3.5 ile bu assembly'ler 3.5.0.0 versiyonuna yükseltilmişti.
Bu durumda aklıma gelen ilk çözüm, kontrollerimi .net 3.5 framework ile yeniden derlemek oldu. Kontrollerin kaynak kodları olduğu için bunu gerçekleştirmek çocuk oyuncağıydı; fakat ya kaynak kod elimde olmasaydı? Microsoft mühendislerinin bunu atlamayacağına emin olduğum için, Google'a (in Google we trust) sordum ve cevabımı aldım. Microsoft, versiyon problemlerine karşı <assemblyBinding> etiketini geliştirmiş.
Aşağıdaki kodu web.config'e eklerseniz benim yaşadığım sorunu yaşamayacaksınız. Aşağıdaki konfigürasyon kodu, eski versiyonlu assembly referanslarını yenisine yönlendirmek ve yeni versiyonların kullanılmasını sağlamak kadar basit bir mantık üzerine dayanıyor.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Bu yazıyı okuyarak olası bir 30 dakika kazandınız. Umarın bu süreyi facebook'da pineklemek yerine sevgilinizi, eşinizi, ailenizi vs. aramakla geçirirsiniz. :)