You are on page 1of 3

C# ve dotNET ile birlikte yazlm gelitirmeye yeni bir soluk gelmi olsada C# ile eskiden yazlm COM komponentlerine

eriebilmek mmkndr. Daha nceki iki makalede .NET ve COM ilikisini detayl bir ekilde incelemitik. Bu makalede .NET'in Win 32 API ile nasl entegre edildii anlatlacaktr. .NET ve C#'n yeni imkanlarnn yansra eski bir teknoloji olan COM ve ynetilmeyen(unmanaged) kodlarla uyumlu bir ekilde almas belkide C# ve .NET'i dier yazlm gelitirme platformlarndan ayran en nemli zelliktir. Bildiiniz gibi C#'ta gsterici kullanm tamamen serbesttir. Bu yzden eskiden(.NET ncesi) yazlm ve parametre olarak gsterici alan COM komponentleri ve Windows API fonksiyonlar C# ile sorunsuz bir ekilde altrlabilmektedir. Bu yazda Win API fonksiyonlarnn .NET ortamnda ne ekilde ele alnd incelenecektir. Win32 sistem fonksiyonlar kullanldnda, kod CLR tarafndan ynetilmekten kar. .NET ortamnda gelitirilen bir uygulamada ynetilmeyen kod segmenti ile kalalrsa ilgi kod segmenti CLR tarafndan ynetilmekten kar. Dolaysyla "garbage collection" mekanizmas ve .NET'e zg dier servisler kullanm d olur. CLR tarafndan ynetilmeyen kodlara eriebilmek iin C#'ta System.Runtime.InteropServices isim alannda bulunan ve DllImprtAttribute snfn temsil eden DllImport nitelii kullanlmaktadr. DllImport nitelii ile harici bir kaynakta bulunan metoda referans vermek iin external anahtar szc kullanlr. Bir snf bildiriminin en banda external anahtar szc ve DllImport nitelii kullanlarak CLR tarafndan ynetilmeyen bir metot bildirimi yaplr. Tabi metodun gvdesi harici bir kaynakta zaten var olduu iin bizim metodun gvdesini yazmamzn bir anlam yoktur. Ardndan bu metot snfn istenildii yerinde kullanlabilir. sterseniz basit bir rnekle DllImport niteliinin kullanmn gsterelim. Win API windows sistemlerinin programlanabilir arayzn iermektedir. Windows uygulamarnn tamam bu arayzdeki fonksiyonlar ve dier yaplar kullanmaktadr. Aadaki programda Win32 sistemlerinde bulunan MessageBox() fonksiyonunun kullanmna bir rnek verilmitir. using System; using System.Runtime.InteropServices; class Class1 { [DllImport("user32.dll")] public static extern int MessageBox(int tip,string mesaj,string baslik,int secenek); static void Main() { MessageBox(0,"Mesaj","Win API MessageBox",2); } }

DllImportAttribute snfnn bir tane yapc metodu bulunmaktadr. Bu metot parametre olarak harici kaynan ad belirtmektedir. Yukardaki kaynak kodda MessageBox fonksiyonunun bulunduu "user32.dll" isimli dosya DllImport niteliine parametre olarak verilmitir. Bu rnekte dikkat edilmesi gereken dier nokta ise extern anahtar szcnn kullanmdr. Bu anahtar szck ile bildirimi yaplan metodun harici bir dosyada olduu belirtilmektedir. Dolaysyla C# derleyicisi metodun gvdesini kaynak kodda aramayacaktr.

Yukurdaki ktdan ve kaynak koddan da grld zere Win API deki bir fonksiyonun arm klasik metot armndan farkl deildir. Deien tek ey metodun bildirim eklidir. Not : Gsterilen mesaj kutusunun farkl formlarn grmek iin MessageBox metodunun parametreleri ile oynayn. imdi ksaca yukardaki programn alma zamanndaki durumunu inceleyelim. Program altrldnda, CLR tarafndan ynetilmeyen bir metot arm yapldnda ilgili kaynaktan metot bellee yklenir ve bellee yklenen metodun balang adresi saklanr. Ardndan bizim parametre olarak getiimiz deikenler DLL' deki fonksiyona uyumlu hale getirilir ve parametre olarak geirilir. Eer bir geri dn deeri bekleniyorsa ynetilmeyen kod blmnden gelen deer uygun .NET trne dntrlerek ilemlere devam edilir. Bu ilemler tamamen .NET'in alt yapsn ilgilendirmektedir. Dolaysyla programcnn yapaca i sadece metodun bildirimini doru bir ekilde gerekletirmektir. DllImportAttribute snfnn bir ka nemli zellii daha vardr. Bunlardan en nemlisi harici kaynaktaki bir fonksiyona takma isim verebilmemizi salayan string trnde olan EntryPoint zelliidir. EntryPoint zelliini kullanarak MessagBox fonksiyonuna takma isim verebiliriz. Fonksiyon arm bu takma isim ile gerekletirilebilmektedir. rnein MessageBox fonksiyonuna TebrikMesajiVer eklinde bir takma isim vermek iin aadaki gibi bir bildirim yaplmaldr.
using System; using System.Runtime.InteropServices; class Class1 { [DllImport("user32.dll",EntryPoint = "MessageBox")] public static extern int TebrikMesajiVer(int tip,string mesaj,string baslik,int secenek); static void Main() { TebrikMesajiVer(0,"Tebrikler","Takma sim Verme",0); } }

imdi de DllImport nitelii ile ilgili dier zelliklere ve nemli noktalara bakalm. 1 - DllImport nitelii yalnzca metotlara uygulanabilir. 2 - DllImport nitelii ile iaretlenmi metotlar mutlaka extern anahtar szc ile bildirilmelidir. 3 - DllImport niteliinin EntryPoint'in haricinde 4 tane isimli parametresi(named parameter) daha vardr. Bunlar : CallingConvention, CharSet, ExactSpelling, PreserveSig ve SetLastError parametreleridir. Bu parametrelerden nemli olanlar aada aklanmtr. 4 - CallingConvention : Bu paramtre CallingConvention numaralandrmas trndendir. Bu parametre ile harici metodun ne ekilde arlaca ile ilgili bilgi verilir. CallingConvention numaralandrmas 5 tane sembol ierir. Varsaylan olarak bu sembol Winapi olacak ekilde ayarlanmtr. Yani CallingConvention parametresini DllImport ile kullanmyorsak varsaylan olarak bu Winapi'dir. Dier semboller ise Cdecl, FastCall, ThisCall, StdCall eklindedir. En ok Winapi sembolu kullanld iin dier sembollerin ne anlama geldii anlatlmayacaktr. Dier sembollerin ne anlama geldiklerini MSDN ktphanesinden detayl bir ekilde renebilirsiniz. 5 - CharSet : Harici fonksiyonun armnda kullanlacak karekter setini belirler. Bu parametre CharSet numaralandrmas ile belirtilir. Varsaylan olarak CharSet.Auto eklindedir. CharSet numaralandrmasnn dier sembolleri Ansi, Unicode ve None eklindedir. 6 - ExactSpelling : EntryPoint ile belirtilen ismin ilgili fonksiyon ismine yazm biimi bakmndan tam uyumlu olup olmayacan belirtir. Bu zellik bool trndendir ve varsaylan olarak false deerdir. DllImport metodunun varsaylan arm biimi olan Winapi sadece Windows sistemlerine zgn olduu iin sistemler aras tanabilirliin yksek olmas gereken projelerde bu niteliin kullanmndan kanmak gerekir. Bu yzden DllImport zelliini kullanmadan nce ilgili fonksiyonun .NET Framework iinde olup olmadn kontrol etmek gerekir. rnein MessageBox fonksiyonu zaten System.Windows.Forms isim alannda bulunduu iin API kullanarak bu fonksiyondan yararlanmak mantkl deildir. Zira ileride programnzn Linux ortamnda yada dier farkl ortamlarda da almasn istiyorsanz programnz deitirip yeniden derlemeniz gerekecektir. Oysa .NET Framework iinde bulunan standart snflar ve onlarn metotlarn kullanrsanz byle bir derdiniz olmayacaktr.

You might also like