.NET in temelleri -5

.NET in temelleri - 5

Merhaba bu yazıda, bir önceki bölümde ele almaya başladığımız shared assembly lere biraz daha detaylı olarak göz atacağız, ve versiyon numaraları ve yönetimleri gibi konuları inceleyeceğiz.

Yeni Versiyonlar ??

Zamanla kullanıcılar veya programınızı kullanan diğer programcılar sizden yeni özellikler istemeye başlayacaklardır. Sizde bu özelikleri ekledikçe programınızın yeni versiyonları ortaya çıkmaya başlar. Burada konuyu dağıtmadan incelemek için, önceki yazılardan kullandığımı dll ve istemci uygulamayı kullanacağız Şimdi gelelim bir assembly lerin versiyonlarına. Assembly versiyonlarını belirtmek için dört ayrı alan kullanan bir yazılıştan faydalanıyoruz.

Şimdi biraz daha açıklayıcı olabilecek bir şekil ile devam edelim: 

Burada incelediğimiz bir versiyon numarası, ve yukarıdaki şekil numaralandırılan alanların iki farklı versiyondaki farklılıklarını özetliyor. Bir parça karışık gibi görünüyor ama panik yok, gayet basit bir şey aslında. Geçen örneğimizde bir shared assembly e ait strong name, ( ben buna "kesin isim" diye bir karşılık buldum ) içinde yer alan public key den bahsetmiştik. Ancak bir önceki yazıdan hatırlayacağınız gibi , strong name içinde bir de versiyon bilgisi bulunuyor. Bu bilgi, assembly çağırılırken onun kimliğini netleştirmeye yarıyor. Yani "falanca filanca" adlı ve "1.23.11.2" versiyonlu assembly gibi çağırdığınızda, bir assembly nin kimliği iyice netleşiyor. Ancak versiyon nosunun tek amacı bu değil tabii ki, sürekli bahsettiğimiz değişik versiyonları aynı anda kullanılması işlemi için de bulunması şart. Şimdi daha önce açıkladığımız bind işlemine geri dönelim: eğer bu işlemin içine sadece public key değil, bir de versiyon numarası girerse ne olur ? O zaman bind işlemi sırasında versiyon uyumluluğu da kontrol edilir. Aslında bu işlem bir önceki yazımızdaki assembly için de gerçekleşti, ama konuyu dağıtmamak için bahsetmedim. Şimdi GAC içinde yer alan ( artık GAC ne demek biliyorsunuz değil mi ?) globaldll dosyasına bir göz atın. Sağ tuşla tıklayıp özelliklerine bakınca, orada versiyon numarası olarak 0.0.0.0 göreceksiniz. Şaşırtıcı bir durum değil, çünkü hiçbir noktada bir versiyon numarası vermedik. Peki ama versiyon numarası verseydik ( nasıl olacağı birazdan geliyor ) bu binding işlemi açısından nasıl bir anlama gelirdi ? .NET runtime, paylaşılan bir kaynağa bağlanırken, aranan kaynak ile bulunan kaynakların versiyon numaralarını inceler ve belli kurallara göre hareket eder. Diyelim ki elimizde 1.2.3.4 diye bir assembly var. Biz bu assembly nin 1.3.2.4 versiyonunu da GAC içine koyduk. Bu ikinci assembly, birinci ile aynı public – private key ile derlendi, bu durumda isim ve public key leri aynı !! ( Bu bilgiler de manifest içinde yazıyor doğal olarak )Bu iki assembly arasındaki farkı belirlemek için versiyon numarası işte bu yüzden zorunlu. Ancak makinada ikisi birden değil de sadece ikincisi olsaydı o zaman ne olurdu ? O zaman da .NET runtime, yukarıdaki şekilde bulunan kuralları uygulardı. Yani bulunan assemblynin major ve minör numaraları farklı olacağı için, bu assembly nin bulunan versiyonu aranan versiyon ile uyumsuz kabul edilirdi, ve assembly resolver, aranan kaynağın bulunamadığını bildirirdi. İşte yukarıdaki şekil, bir shared assembly nin  versiyonu incelendiğinde binding açısından uyumlu mu değil mi kararı nasıl sonuç verir onu gösteriyor!(biraz uzun mu açıkladım? :) O zaman örnek senaryoları gösteren bir iki şekil ile daha da netleştirelim: Peki şimdi bu ne anlama geliyor ??? Sakin olun, paniğe gerek yok, burada basit bir şekilde assemblylerin versiyon politikasının nasıl işlediğini görüyoruz. İlk olarak globalclient.exe çalışıyor. Globalclient.exe derlenirken global bir assembly içindeki kaynakları kullanacak şekilde derlenmiş, bu nedenle kendi manifest i içinde 1.0.0.0 versiyonlu, filanca isimli ve şu public key e sahip assemblyi arıyorum diyor. Bu durumda assembly resolver devreye giriyor ve bir bakalım o zaman nerede bu aranan kaynak diye aramaya başlıyor. İlk başta bu kaynağın bir private assembly mi yoksa public assembly mi olduğu inceleniyor. Bu da kolayca nasıl çağırıldığından anlaşılabilir, zira private assembly ler strong name içermiyor.Bunun bir public assembly olduğu anlaşılınca, o zaman bakılacak yer de GAC oluyor. Fakat GAC içinde aynı isim, ve public key ile tam 3 tane assembly var!!! İşte bu noktada versiyon numaraları sahneye çıkıyor ve resolver bizim için aradığımız dlli seçiyor. Dikkatinizi çektiyse, ilk şekildeki kurallar, eğer major ve minör numaralar farklı değilse o zaman uygun olabilir diyor, yani 1.0.2.0 ile 1.0.3.4 versiyonları birbirine kabul edilebilir derecede yakın. İyi ama bu yakınlığa rakamsal olarak bakıp, kesin uyumludur bunlar diyemeyiz ki..Aslında burada devreye yazılı olmayan kurallar giriyor. Bir yazılımın versiyonlarını belirlerken kimse sizi kesin kurallar ile sınırlamaz. Bu iş için tamamen kafanıza göre hareket edebileceğiniz gibi, belirli kurallara da uymanız gerekebilir.Mesela çalıştığınız yazılım firması, kendi kurallarını belirleyebilir.Bu durumda hiçbir şey tam olarak belli değil, ama bu bölümün sonuna gelirken, .NET versiyon numaraları ve uyumluluk hakkında nasıl bir sistem öneriyor, bir daha tekrarlayalım: major ve minör numaraları daha büyük değişiklikler içeren, ve geriye doğru uyumluluğun belli açıklardan bozulduğu versiyonlarda kullanın. Yani sırf yeni bir fonksiyon eklediniz diye assembly versiyonu 1. den 6 ya çıkarmayın :) Revizyon ve build (qfe) numaraları, ufak değişiklikleri belirtmek için ideal olacaktır. Tabii ki bunlar sadece öneri, yani isterseniz, buradaki tüm önerileri boş verebilir ve sistemin kendi istediğiniz şekilde versiyon uyumluluğunu yönetmesini sağlayabilirsiniz. O nasıl olacak diyorsanız, bir sonraki bölümü beklemeniz gerekiyor...Bu noktaya kadar her şeyi tam olarak kavradıysanız, sistemin nasıl çalıştığını ana hatlarıyla biliyorsunuz demektir. Tabii ana hatlar hiçbir zaman yeterli olmaz :) Tam bir hakimiyet için, daha derinlemesine çalışmamız lazım. Bunu da bir sonraki yazıda yapacağız, ve bu anlatılanları somut kod örnekleri ile pekiştirip, başka detaylara da gireceğiz.

Şimdilik hoşçakalın.

Döküman Arama

Başlık :

Kapat