.Net Framework kullanılarak geliştirilen masaüstü Windowsuygulamalarında bildiğimiz üzere uygulama geliştiriciler geliştirdikleriuygulamalarının kullandıkları & refere ediyor durumda oldukları .NetAssembly’ lerini işletim sisteminin kök klasörü içerisinde bulunan Assemblyklasörü içerisindeki havuzdan kullanabilmektedirler. Daha açık ifade etmekgerekirse Global Assembly Cache ismi ile ifade edebileceğimiz bu merkezcilhavuz mekanizması yardımı ile birden çok uygulamanın aynı zaman sürecindeihtiyaç duydukları assembly’ leri tek bir noktadan kullanılabilmesine olanaksağlayan bu sistem aynı assembly’ nin disk üzerinde defalarca kopyalanmasıihtiyacına cevap olmaktadır.
Şekil üzerindende anlaşılabileceği üzere .Net Framework DLL’lerinin tümü bu merkezcil havuz üzerinde kayıtlı bulunmakta ; bu DLL lereihtiyaç duyan tüm uygulamalar aynı lokasyon üzerinden DLL’ in kopyasınıoluşturmaya gerek duymadan rahatlıkla kullanabilmektedirler.
Global Assembly Cache ; kısa adıyla GAC’ ın sağladığı enmantıklı fayda ise aynı DLL’ in disk üzerinde bu DLL’ i her kullanan uygulamaiçin defalarca tekrar tekrar kopyalanması yerine sunduğu merkezcil yapı olarakifade edilebilmektedir. Bunun yanı sıra DLL’ in disk üzerinde oluşturulmuş tekbir kopyasının böyle bir havuz içerisinde uygulamala sunulmasının versiyonlamaperspektifinden de fayda sağladığı çok açık bir şekilde farkedilebilmektedir.
Fakat günümüzdeki masaüstü bilgisayarlarının donanımsalyeterliliğini göz önünde bulundurduğumuzda disk alanı bakımından aslında çoktasorun yaşanmayacağını ; fakat merkezcillik açısından fayda sağlayacağı açık birgerçektir.
Bu noktada makalemizinde konusunun temelini oluşturan önemlibir nokta üzerinden yazımıza devam edelim.
Bilindiği üzere uzun yıllardan beri mobil cihazlar üzerindeyaşanan bellek & donanım sıkıntıları uygulama geliştiricilerin başına dertolmaktadırlar. Bu tip cihazlara uygulama geliştiren uygulama geliştiriciler hertürlü ihtimali göz önünde bulunduracak şekilde mobil cihaz uygulamalarınıgeliştirmekte ; yaşanabilecek bellek sıkıntılarının önüne geçebilmek adına iseuygulamalarda gerçekleştirilebildiği kadar kısma işlemine gitmektedirler (ThinClient).
Bu makalemizde ise belki gördüğünüzde “budamı vardı ?”diyebileceğiniz bir konu ile ilgili ; .Net Compact Framework DLL’ lerinin mobilcihazınız üzerinde Global Assembly Cache içerisine kopyalanarak merkezcil biryapı üzerinden bellek tasarrufunun nasıl sağlanabileceği ile ilgili anlaşılırbir örnek uygulama geliştireceğiz.
Bu noktada konunun daha rahat anlaşılabilmesi açısındanteorik ifadelerden öte pratiksel bakımdan çalışmaya hemen başlayalım.Senaryomuz gereği uygulamamız içerisinde basit bir executable uygulama ; buuygulamanın kullandığıda bir DLL refere olarak kullanılacaktır. Gerçekleştirmekistiyor olduğumuz temel senaryo ise uygulamanın bu DLL’ e lokal lokasyonundandeğilde ; mobil cihazımızın işletim sistemi içerisindeki Windows klasörüiçerisinden merkezcil olarak ; GAC aracılığıyla erişecek olduğudur.
Hiç vakit kaybetmeden örnek uygulama üzerinde çalışmayabaşlayalım. Konu ile ilgili önemli gereksinimler yazı içerisinde detaylı olarakanlatılacaktır.
İlk noktada GACAssembly isminde bir Mobil Cihaz ClassLibraryı projesi açıyoruz.
Bu proje içerisine standart olarak eklenen fiziksel csdosyasının ismini clGAC.cs olarak değiştiriyor ; şekildeki sınıfı fizikseldosya içerisine ekliyoruz.
Projemizi build ediyoruz ve GAC’ a atılmak üzeregeliştiriyor olduğumuz DLL ile ilgili “çok önemli” gerçekleştirmemiz gerekenbirkaç adım üzerinden uygulamamıza devam ediyoruz.
Bilindiği üzere bir DLL’ in GAC’ a atılabilmesi içingerçekleştirilmesi gereken en önemli adım DLL’ in Strong Name bir DLLolmasıdır. Bu noktada aynı yapı mobil cihazlar üzerindeki sistem içinde geçerlidir.
Mobil cihazlar üzerinde bir DLL’ in cihaz üzerinde GAC’ agönderilebilmesi için DLL’ in strong name bir DLL olması gerekmektedir. Bunoktada strong name key file üretmek için Visual Studio 2005 Command Promptpenceresi üzerinden :
Şekildeki komutu çalıştırarak c:\Key.snk lokasyonundabulunacak bir strong name key file oluşturuyoruz. Sıra geldi bu Key file ileDLL’ imizi ilişkilendirmeye. Bu noktada projenin özellikleri içerisinde bulunanSigning sekmesi içerisinde key dosyamızı DLL ile ilişkilendirip projeyi buildediyoruz.
İşte bu kadar ! Konu ile ilgili gerçekleştirilmesi gerekentüm işlemlerin neredeyse hepsi gerçekleştirilmiş durumda.
Sıra geldi test amaçlı geliştirilecek olan mobil cihazuygulamamıza. Bu uygulama içerisinde senaryo gereği DLL içerisinde tanımlı olansınıfımızın bir instance’ ı oluşturulacak ; kısaca uygulama bu DLL’ e ihtiyaçduyacak şekilde tasarlanacaktır.
Hiç vakit kaybetmeden mobil cihaz uygulamamızı geliştirmeyebaşlayalım. İlk noktada standart bir Mobil Cihaz Windows projesi açarak işebaşlıyoruz.
Hız kesmeden uygulamamızı geliştirmeye devam ediyoruz. Amaçbir önceki adımda geliştirmiş olduğumuz DLL’ i kullanan standart bir uygulamageliştirmek olacaktır. Bu noktada ilk olarak DLL’ i projemize refere ediyoruz.Dikkat edilecek unsurlardan birisi ise DLL referansının Copy Local özelliğinefalse değeri verilmiş olduğudur. Bu değer DLL’ in uygulamanın çalıştırılıyorolduğu işletim sisteminin GAC’ ı üzerinden erişileceği anlamına geliyor olmaktadır.
Bir sonraki adımda şekildeki 3 satırlık kod bloğunu uygulamaekranının yüklenmesi esnasında çalıştırılacak şekilde tasarlıyoruz.
Ve bitti ! Uygulamamızı build ediyor ve ilgili adımlarıgerçekleştirmek üzere makalemize devam ediyoruz.
Bu noktada bir DLL’ in mobil cihazımız üzerindeki GAC’ aatılabilmesi için DLL’ in mobil cihaz üzerinde bir klasöre kopyalanmış olmasıgerekmektedir. Biz örnek olarak mobil cihazımızın kök klasörü içerisindebulunan GACFiles isimli bir klasörün içerisine DLL’ imizi kopyalayacak ; birsonraki adımda ise bu noktadan GAC’ a göndereceğiz.
DLL’ i mobil cihazımız üzerine kopyalamadan öncegerçekleştirmemiz gereken bir diğer önemli adım ise DLL’ in mobil cihazüzerindeki fiziksel lokasyonunu belirten *.gac uzantılı bir metin dosyası oluşturmamızgerekliliğidir.
Hazırlanan bu dosyayı mobil cihazımız üzerinde bulunanWindows klasörü içerisine kopyalamamız gerekmektedir. Hiç vakir kaybetmeden*.gac uzantılı bu dosyayı oluşturuyor ; içerisine az sonra mobil cihazımıziçerisine kopyalayacak olduğumuz DLL’ in adresini tanımlıyoruz.
Dosyayı *.gac uzantısıyla kayıt ediyoruz.
İşte bu kadar ! Sıra geldi üç dosyayı ilgili lokasyonlarakopyalarak GAC’ a kopyalama işini gerçekleştirmeye. Başka bir makalemizde ifadeettiğimiz üzere mobil cihazımız ile paylaşımlı kullanılacak şekilde birklasörün içerisine EXE, DLL ve GAC Dosyalarını kopyalıyoruz.
Sıra geldi uygulamamızın en heyecanlı noktasına. Budosyalara bu klasör ile haberleşebilecek şekilde konfigüre edilmiş bir emülatöryardımıyla erişeceğiz ve sırasıyla şu adımları gerçekleştireceğiz :
Emülatörümüz üzerinde kök dizin içerisinde GACFiles isimlibir klasöre oluşturacak ; GACAssembly isimli DLL’ imizi bu klasörün içerisinekopyalacağız. GACSample.gac isimli dosyamızı Windows klasörü içerisinekopyalayacağız. Ve son olarak GACSample.exe isimli uygulamamızı çalıştırmayaçalışacağız.
.Net Compact Framework lokal lokasyon içerisinde DLL’ ibulamayacağından GAC içerisine bakacak ; ilk istekte bu lokasyondada bulamadığıiçin *.gac uzantılı dosya içerisinde dosyanın gerçek lokasyonuna erişecek ; vebu lokasyondan DLL’ i GAC içerisine taşıyacaktır. Hepsi bu kadar !
Hiç vakit kaybetmeden ilgili işlemleri gerçekleştiriyoruz :
Emülatör içerisinde dosyalara erişebilmekteyiz. İlk olarakDLL’ imizi GACFiles isimli kök klasörün içerisine taşıyoruz.
Bir sonraki adımda *.gac dosyamızı Windows klasörü içerisinetaşıyoruz :
Ve sıra geldi uygulamamızı çalıştırmaya ! Normal şartlardauygulama DLL’ i bulamadığı için hata vermesi gerekmektedir. Ama senaryomuz veyapı gereği DLL GAC içerisinde aranacak ; bulunamadığı durumda ise gerçeklokasyonundan GAC içerisine taşınacaktır. Uygulamamıza tıklayarak çalıştırıyoruz:
Bingo ! Uygulamamız DLL lokal lokasyonda olmamasına rağmenbaşarılı bir şekilde çalıştırılmıştır. GACFiles içerisine baktığımızda DLL’ inolmadığını rahatlıkla farkedebiliriz :
Çünkü DLL’ imiz .Net Compact Framework tarafından GAC içerisinetaşınmıştır :
İşte buda kanıtı !
Bu makalemizde mobil cihazlar üzerinde GAC kullanımınadeğindik. Başka bir makalede daha görüşmek dileğiyle.