C# Dersleri 0'dan.

ALcatraz'

Kıdemli Üye
30 May 2013
4,338
4
İstanbul


Burdan C# Dersleri paylaşacağım 0'dan. :)


Her Yönüyle ilk C# Programımız ;


C# dili ortaya çıkalı daha hiç birşey yapmayan varsa ya da birşeyler yapıp da ne yaptığından emin olmayan varsa işte bu yazı tam size göre. Bu yazımızda klasik Merhaba Dünya programımızı yazacağız.Ama programımızı yazarken her şeyi adım adım öğreneceğiz. Unutmayın amacımız burada Merhaba Dünya yazmak değil. :) O halde aşağıdaki programı iyice inceleyin önce, şöyle bir süzün programı yukarıdan aşağıya, fazla detaylara inmeden yazımızı okumaya devam edin;

C#:
//dosya adı : Merhaba.cs
using System;
namespace MerhabaDunya
{
    class Sınıf1
    {
        static void Main(string args[])
        {
         Console.WriteLine("Merhaba Dünya");
        }
    }
}


Yukarıdaki ilk programımızı incelediğinize göre açıklamalarımıza geçebiliriz. Eğer önceden C++ ve Java ile ilgilenmiş arkadaşlar varsa yukarıdaki kodlar tanıdık gelebilir. Nitekim, her ne kadar Microsoft firması ilk başlarda bunu kabul etmese de C# dili Java ve C++ dillerinin harmanlanmasından oluşmuş bir dildir. Bugün bunu kabul etmeyen yoktur sanırım.


Yukarıdaki ilk programımızın kodunu ben Notepad ile yazdım. Ama kodu derleyip çalıştırmak için bir C# derleyicisine ihtiyacımız olacak. C# derleyicisi Visual Studio.NET ile kurulabileceği gibi Microsoft Corporation web sitesinden .NET Framework yazılımını indirerek de kurulabilir. Eğer Visual Studio ortamında çalışıyorsanız yukarıdaki kodları Visual Studio .NET ' in sunduğu hazır proje şablonlarından rahatlıkla oluşturabilirsiniz. Visual Studio programını çalıştırdıktan sonra Project->New menüsünden dil olarak Visual C# ve proje şablonu olarak da "Console Application" seçerseniz, main işlevi içindeki kodlar dışındaki yapı otomatikmen oluşturulacaktır.Eğer .NET Framework yapısını kurduysanız Console Ekranından C# derleyicisini çalıştırmalısınız. Komut ekranını yazarak kaynak kodumuzu derleyebilirsiniz.


Şimdi kodlarımızı inceleyelim. İlk satırdaki ifadesi System adlı bir isim alanının kullanılacağını belirtiyor. Peki nedir bu isim alanı(Namespace). İsim alanı kavramı son yıllarda program modüllerinin çok sayıda artmasından dolayı popüler hale gelmiştir. Kolay ve hızlı programlama yapmamızı sağlayan bir takım hazır kütüphaneler her ne kadar işimizi kolaylaştırsa da eğer isim alanları olmasaydı kullanacağımız her kütüphane bizim için işin içinden çıkılmaz bir hale gelebilirdi. Düşünün ki iki ayrı firma iki ayrı sınıf kütüphaneleri oluşturdu ve bu kütüphanelerin içinde aynı isimli birden çok sınıf yapısı var. Eğer biz programcı olarak iki firmanın da kütüphanesini kullanmak istiyorsak her ikisini aynı kod içinde kullanamayız. Çünkü aynı isimli sınıflar derleme aşamasında hata verecektir. Bu durumda yapılması gereken tek şey ya da en etkili yöntem isim alanlarını kullanmaktır. Yani bir sınıfa(class) ulaşabilmek için onun isim alanıyla çağırmak. İsim alanları hiyerarşik yapıda olabilir. Mesela System isim alanının altında başka bir isim alanı onun altında başkaları vs. İşte .NET isim alanı(namespace) hiyerarşisinin en tepesinde bulunan isim alanı System adlı isim alanıdır. En temel işlemlerimiz için bile bu isim alanını kullanmalıyız. Aksi halde programımız çalışmayacaktır. İsim alanlarını kullanmak için isim alanının başına using sözcüğü getirilir.


Soru: System isim alanının içinde Data isimalanında bulunan bir cs adlı sınıfı kullanabilmek için kaynak kodumuza ne eklememiz gerekir.


Cevap : Kaynak kodumuzun en başına aşağıdaki ifadeyi yazmamız gerekir.


C#:
using System.Data;


Bildiğiniz gibi C# dili %100 nesne tabanlı bir dildir. Yaptığımız her şey bir sınıf nesnesidir C# dilinde. Nesne olmayan hiçbir şey yoktur. C++ dilindeki main işlevini hatırlarsınız çoğunuz. Programımız c++ dilinde main işlevinden başlar ama main işlevi hiç bir zaman bir sınıf içinde olmamıştır. C# dilinde her şey sınıflarla temsil edildiği için main işlevi de bizim belirlediğimiz bir sınıfın işlevi olmak zorundadır. Yukarıdaki programımızda ifadesi ile programımızda bir sınıf nesnesi oluşturuyoruz. Sınıf1 sınıfının bir işlevi olan main'in elbette eskiden de olduğu gibi özel bir anlamı vardır. Biliyorsunuz ki derleyiciler programın nerden çalışacağını bilmek isterler, aksi halde derleme işleminden sonra "programınız için başlama noktası bulunamadı" hatası alırız. Bu yüzden main işlevi bizim için eskiden de olduğu gibi programımızın başlangıç noktasıdır. Yani biz programda yapmak istediklerimizi main işlevi içinde gerçekleştireceğiz. Sınıf tanımlamalarımızı ise istediğimiz noktada yapabiliriz. Daha öncede dediğimiz gibi isimalanları birçok sınıfın veya tek bir sınıfın oluşturduğu kümedir. Bizim ana programımız da bir sınıf olduğuna göre Class1 sınıfını istediğimiz isimli bir isimalanına sokabiliriz. Yukarıda yazarak isimalanını başlatıyoruz.


Şimdi main işlevinin içine bakalım, System isim alanında bulunan Console sınıfının bir metodu olan WriteLine() ile ekrana bir string ifadesi yazdırıyoruz. Biz burada iki tırnak ifadesi içinde yazımızı belirtmemize rağmen fonksiyonun kullanımı bununla sınırlı değildir. C# dilindeki fonksiyon aşırı yükleme (function overloading)kullanılarak fonksiyonu birçok parametrik yapıda kullanabilmemiz sağlanmıştır. Fonksiyon aşırı yükleme konusuna bundan sonraki yazılarımızda değineceğimizi belirtelim. WriteLine() işlevinin adından da anlaşılacağı gibi ekrana basmak istediğimiz yazıdan sonra satır atlama işlemi yapar. Bunu test etmek için bir tane "Merhaba Dünya" da siz yazdırın. Göreceksiniz ki siz belirtmemenize rağmen alt alta iki tane "Merhaba Dünya" yazısı çıkacak.

Eğer bu programı yazıp derlediyseniz ne mutlu size ki C# dünyasına güzel bir adım attınız.

C ve C++ bakış açısıyla C# dili


Bildiğimiz gibi bilgisayarları programlamak için programlama dillerine ihtiyaç duyulur. Bu dillerden en popülerleri Basic, C, C++,Pascal, Java ve Assembler 'dır. Makine dili ise donanımı kontrol etmek için donanımı üreten firma tarafından tanımlanan komutlar kümesidir. Bazı programlama dilleri derleyicilere ihtiyaç duymasına karşın bazıları ise yorumlayıcılara ihtiyaç duyarlar, mesela bir c++ programını çalıştırabilmek için C++ derleyicisine ihtiyacımız varken, Perl ile yazılmış bir CGI scripti için komut yorumlayıcısına ihtiyacımız vardır. Derleyiciler programı çalıştırmadan önce kodları makina komutlarına çevirirler fakat yorumlayıcılar bir grup kodu satır satır ya da bloklar halinde yorumlayarak çalıştırırlar.


Aslında derleyiciler de, komut yorumlayıcıları da birer bilgisayar programından başka bir şey değildirler. Yani c ve c++ dilleri bir giriş bekleyen ve çıkış veren birer bilgisayar programları gibi düşünülebilir. Giriş olarak kaynak kodu veren bu programlar çıkış olarak ise makine kodu üretirler.

C ve C++ dillerine kısa bir bakış


C dili en popüler yapısal programlama dilidir. C dili Dennis Ritchie tarafından, Martin Richards ve Ken Thompson tarafından geliştirilen BCBL ve B dillerinin temelleri üzerine kuruldu.

C dili "The C Programming Language by Brian Kernighan and Dennis Ritchie" kitabıyla büyümüştür.C dili için, 1983 yılının büyük önemi vardır.Çünkü 1983 yılında ANSI standartlar komitesi C standartları için toplanmıştır.Bu standartlaşma süreci tam 6 yıl sürmüştür.Ve tabi ki şu anki standartların oluşumuna katkıda bulunan ANSI 99 standartları da diğer önemli bir gelişmedir.


C programcılar tarafından herhangi bir tür program geliştirmek için yazılmış genel amaçlı bir dildir. C ile bir düşük seviyeli sistem için program yazabileceğimiz gibi, yüksek seviyeli bir GUI(Grafik Arabirimi) tasarlamamız da mümkündür.Ve elbette kendi kütüphanemizi de C ile oluşturabiliriz.C dilinin ortaya çıkmasından bunca yıl geçmesine rağmen popülaritesini hiçbir zaman kaybetmemiştir. Günümüz programcıları çeşitli amaçlar için programlarını geliştirirken C dili ile yazılmış kaynak kodlarını kullanırlar.


Bjarne Stroustrup 1980 yıllında C++ dilini ortaya çıkarmıştır. C++ dili C temelli ve C nin bir üst kümesi olarak düşünülebilir. C++ en popüler nesne temelli programlama dilidir. C++ dilinin ilk ismi "C with Classes"(C ile sınıflar) idi. C++ dili C diline nazaran daha etkili ve güçlüdür.Ve en önemli özellği ise C 'den farklı olarak nesne temelli bir dildir.Şu anda C++ dili ANSI ve ISO kuruluşları tarafından standartlaştırılmıştır. Bu standartların son versiyonu 1997 yılında yayınlanmıştır.

C# diline kısa bir bakış


C#, güçlü, modern, nesne tabanlı ve aynı zaman type-safe(tip-güvenli) bir programlama dilidir.Aynı zamanda C#, C++ dilinin güçlülüğünü ve Visual Basic' in ise kolaylığını sağlar.Büyük olasılıkla C# dilinin çıkması Java dilinin çıkmasından bu yana programcılık adına yapılan en büyük gelişmedir. C#, C++ 'ın gücünden , Visual Basic 'in kolaylığından ve Java 'nın da özelliklerinden faydalanarak tasarlanmış bir dildir. Fakat şunu da söylemeliyiz ki, Delphi ve C++ Builder 'daki bazı özellikler şimdi C# 'da var. Ama Delphi ya da C++ Builder hiçbir zaman Visual C++ ya da Visual Basic 'in popülaritesini yakalayamamıştır.


C ve C++ programcıları için en büyük sorun, sanırım hızlı geliştirememedir. Çünkü C ve C++ programcıları çok alt seviye ile ilgilenirler. Üst seviyeye çıkmak istediklerinde ise zorlanırlar. Ama C# ile artık böyle bir dert kalmadı. Aynı ortamda ister alt seviyede isterseniz de yüksek seviyede program geliştirebilirsiniz. C# dili Microsoft tarafından geliştirilen .NET platformunun en temel ve resmi dili olarak lanse edilmiştir. C# dili Turbo Pascal derleyicisini ve Delphi 'yi oluşturan takımın lideri olan Anders Heljsberg ve Microsoft'da Visual J++ takımında çalışan Scott Wiltamuth tarafından geliştirilmiştir.


.NET framework'ünde bulunan CLR (Common Language Runtime), JVM (Java Virtual Machine)' ye, garbage collection, güvenilirlik ve JIT (Just in Time Compilation) bakımından çok benzer.


CLR, .NET Framework yapısının servis sağlama ve çalışma zamanının kod organizasyonu yapan ortamıdır. CLR, ECMA standartlarını destekler.


Kısacası C# kullanmak için CLR ve .NET Framework sınıf kütüphanesine ihtiyacımız vardır. Bu da demek oluyor ki C#, JAVA, VB ya da C++ değildir. C,C++ ve JAVA 'nın güzel özelliklerini barındıran yeni bir programlama dilidir. Sonuç olarak C# ile kod yazmak hem daha avantajlı hem daha kolay hem de etkileyicidir.

C# ile Temel Windows Form Oluşturmak


Bu yazımızda Windows programlamanın temel elemanlarından olan windows formlarının nasıl oluşturulduğunu ve nasıl kullanıldığını göreceğiz, windows formlarını açıklarken basit bir dört işlem yapan hesap makinası oluşturacağız. Windows formları derken neyi kastediyoruz? Textbox, label, button gibi önemli elemanların hepsi birer windows formudur. Bu windows formlarına ulaşmak için System.Windows.Forms isim alanını kullanıyoruz. Ve tabi ki programımızın aktif bir windows uygulaması olarak çalışması için de aşağıdaki isim alanlarını projemize ekliyoruz.

C#:
using System.Drawing;
using System.Collections;
using System.ComponentModel;


Programımızı yazmaya başlamadan önce programımızın kodlarını içerecek bir isim alanı oluşturalım. Ben buna CsHesapMakinasi adi verdim.(Makaleyi okurken kaynak kodu incelemenizi tavsiye ederim) Siz istediğiniz başka bir isim kullanabilirsiniz.


Daha önceki makalelerimizde belirttiğimiz gibi programımızın çalışması için derleyiciye programın başlangıç noktasını bildirmemiz gerekirdi.Bu başlangıç noktası da genelde main() fonksiyonu oluyordu. Kodumuzu öyle ayarlayacağız ki main() fonksiyonu icra edildiğinde çalıştırmak istediğimiz windows formu ekranda görünsün. Bunun için main içine aşağıdaki kodu yazıyoruz.


C#:
Application.Run(new Form1()); // Yeni bir Form1 nesnesi oluşturularak uygulama olarak başlatılıyor.


Şu an için Form1 hakkında en ufak bir bilgiye sahip değiliz. Peki bu Form1 nasıl oluşturulacak. Yukarıda da bahsettiğimiz gibi Form1 sınıfından bir nesne oluşturmak için System.Windows.Forms isim alanını kullanmalıyız. Bu yüzden bu isim alanının altında bulunan Form sınıfından yeni bir Form1 sınıfı türetmemiz gerekecek, bu türetme işlemi aşağıdaki gibidir. Form1 sınıfını türettikten sonra Form1' içinde bulunacak elemanları tanımlıyoruz.4 işlemi yapmak için 4 buton, işleme giren değerler için 2 textbox ve 2 tane de label formu tanımlıyoruz. Tanımlama işlemi aşağıdaki gibidir.

C#:
public class Form1 : System.Windows.Forms.Form
{
         private System.Windows.Forms.Button button1;
         private System.Windows.Forms.Button button2;
         private System.Windows.Forms.Button button3;
         private System.Windows.Forms.Button button4;
         private System.Windows.Forms.Label label2;
         private System.Windows.Forms.TextBox deger1;
         private System.Windows.Forms.TextBox deger2;
         private System.Windows.Forms.TextBox sonuc;
         private System.Windows.Forms.Label isaret;
 }


Şimdi bu windows formunun ekrana nasıl basıldığını inceleyelim. Main() işlevi içinde yeni bir Form1 nesnesi yaratıldığında Form1 nesnesine ait kurucu işlev olan Form1() işlevi çağrılır.(Kaynak kodu inceleyin). Form1() kurucu işlevinde ise InitializeComponent(); adlı bir fonksiyon çağırılarak Form1 nesnesine ait olan üye elemanlarla (button,label,textbox vs) ilgili ilk işlemler yapılır.From1 açıldığı zaman Form1 içinde bulunan elemanlarla iligili yapmak istediğimiz ilk özellikleri InitializeComponent() fonksiyonu içinde yapıyoruz.

C#:
private void InitializeComponent()
{        
    // form1 içinde yer alacak elemanlar yaratılıyor(kaynak kodu inceleyin)
    this.deger2 = new System.Windows.Forms.TextBox();
    this.sonuc = new System.Windows.Forms.TextBox();
    this.button2 = new System.Windows.Forms.Button();
    this.isaret = new System.Windows.Forms.Label();
    this.label2 = new System.Windows.Forms.Label();
     this.SuspendLayout();
    //
    // elemanlarla ilgili başlangıç özellikleri veriliyor.
    //
    this.deger1.location = new System.Drawing.Point(16, 8); //deger1 adlı textbox için yer bildirimi
    this.deger1.Name = "deger1";
    this.deger1.TabIndex = 0;
    this.deger1.Text = "0";
    this.name="Form1"; //Form1 nesnesinin kendisi için this anahtar sözcüğünü kullanıyoruz
    this.text = "Hesap Makinası ";
    this.BackColor = System.Drawing.Color.FromArgb(((System.Byte)(255)), ((System.Byte)(128)), ((System.Byte)(0)));
    this.ClientSize = new System.Drawing.Size(400, 149);
}


Şimdi sıra elemanlarla ilgili olayların birbirleri ile ilişkisine. Mesela bir buton formunun click olayının form tarafından yakalanabilmesi için aşağıdaki satırları yazmalıyız.

C#:
this.button4.Click += new System.EventHandler(this.button4_Click);
private vo id button4_Click(object sender, System.EventArgs e)
{
    isaret.Text="/";
    sonuc.Text=System.Convert.ToString(System.Convert.ToInt32(deger1.Text)/ System.Convert.ToInt32(deger2.Text));
}


buton4_Click() işlevinde, çalışma zamanında bir nesnenin özelliklerinin nasıl değiştirildiğini görüyoruz.button4 bölme işlemi yaptığından isaret.Text="/"; yazdık. sonuc adlı textbox formunun Text özelliği bir string ifadesi olduğu için işlemlerimizi yaptıktan sonra sonuc.text ifadesine atama yapabilmek için System.Convert isimalanında bulunan ToString işlevini kullanarak ifadeyi String türüne dönüştürüyoruz. Aynı şekilde String olarak aldığımız türler için aritmetik işlem yapabilmek için yine aynı isimalanında bulunan ToInt32 işlevi ile String türünü int32 formatına dönüştürüyoruz. Bütün bu işlemleri 4 butonumuz için yaptığımızda dört işlem yapabilen basit ve bol bol bug içeren (unutmayın amacımız sadece formların kullanımını öğrenmek) bir hesap makinamız olacak.

If else yapısı
Örnek olarak giriş uygulaması yapacağız :)
if = eğer demektir
else = değilse'ye müteakiben bir şey di işte
if 'in kullanımı
if (Eğer doğru ise)
{
Yapılıcak işlemler .
}
else
{
Eğer doğru değilse yapılacak işlemler .
}
Ama biraz karmaşık olucak çünki.
Bir if işlemi içerisinde bir if işlemi daha kullanacağız.

Ve örnek bir uygulama ;
C#:
if (textBox1.Text=="Turkhackteam") // Eğer textBox1'in text'i Turkhackteam' ise 2.if İşlemine bakıcak.
{
    if (textBox2.Text=="Alcatraz")// Eğer textBox2 ' in texti Alcatraz ise
    {
     //Buradaki kodlara bakıcak.
     MessageBox.Show("Kullanıcı Girişi Başarılı");//Ve bize bir mesaj kutusu göstericek.
    }else // Eğer textBox2.Text = Alcatraz değilse
    {
        //Buradaki kodlara bakıcak.
        MessageBox.Show("Yanlış Şifre");
    }
}else //Eğer TextBox1 ' Turkhackteam değilse
{
 //Buradaki kodlara bakıcak.
MessageBox.Show("Yanlış Kullanıcı Adı");
}


Random Sınıfı

Şimdi random sınıfını anlatacağım + bir örnek yapacağım.
İlk önce random nedir ;
Random rastgele demektir .
Rasgele sayılar üretmek için bu sınıfı kullanırız.
İlk önce random sınıfını kullanmak için Random yazmalıyız tamını aşağıdaki şekildedir ;
Random degisken = new Random();
sonra Rasgele oluşan sayıların nerelerde kullanılıcağı ve Kaçtan kaça olucağını yazacağız.
textBox'ta göstermek için ;
textBox1.Text = degisken.Next(kaça kadar gideceği).ToString();

Yani bir örnek ile açıklayayım.
C#:
Random r = new Random();
textBox1.Text = r.Next(5).ToString();
Bu şekilde sadece 1 rakam yazdığımızda 0 ' dan başlayıp o rakama kadar gidecektir.
Amma velakin kaçtan başlatmak sizin elinizde. Şimdi bir örnek daha yapıp bu dersi sonlandırıp bir örnek yapıyım.
* Random r = new Random()
* textBox1.Text= r.Next(1,5).ToString(); ( Burası çok ÖNEMLİ !) 1,5 yazdığımızda 1 'den 5 ' e kadar rasgele oluşturur.

Bir örnek yapıp sonlandırıyorum örnekte .
1 bas. 2 bas. 3 bas. 4 bas. 5 basamaklı sayılardan rasgele sayı oluşturma.
* 5 textBox ' ve 1 Buton ekleyin.
C#:
Random r = new Random();
textBox1.Text = r.Next(1,9).ToString(); //1.Basamaklı 1 ' den 9 'a kadar.
textBox2.Text = r.Next(10,99).ToString(); //2.Basamaklı 10 ' Dan 99 'a kadar.
textBox3.Text = r.Next(100, 999).ToString(); // 3.Basamaklı 100 ' den 999 'a kadar.
textBox4.Text = r.Next(1000, 9999).ToString(); // 4. Basamaklı 1000'den 9999 ' a kadar.
textBox5.Text = r.Next(10000, 99999).ToString(); // 5.Basamaklı 10000'den 99999 ' a kadar.


.Net teknolojilerine Giriş ;


Günümüzde bilgisayar dünyasında internet olmazsa olmaz derecede önemli bir yer edinmeye başladı. Artık insanlar ev ve işyerlerinde kullandıkları uygulamalarına da internet üzerinden erişip kullanmak istiyorlar. Bu internetin getirdiği özgürlüğün kaçınılmaz bir sonucudur.Peki yazılım dünyası buna hazırmıydı? Geliştirilen her programı kolayca internet ormanında da çalıştırabilirmiydik? Bu soruların cevapları bir sene öncesine kadar hayır, olamaz veya şu andaki sistemler bu denli özgürlüğü bize sağlamıyor türündendi.


Microsoft'un ASP'si ile veya PHP ile yapılan uygulamalar tam olarak insanların isteklerine cevap veremiyordu. Her ne kadar iyi ve gelişmiş web uygulamalarını bir yere kadar yapabiliyorduksa da belirli bir noktadan sonra C++,Delphi veya VB ile geliştirdiğimiz modülleri web uygulamamıza ekleyerek sorunlarımızı halletmeye çalışyorduk. Tabi bu tür yöntemler programın gelişme süresini uzatıyordu. Zamanın giderek önem kazandığı bir devirde haliyle programlarımızı da hızlı bir şekilde geliştirmemiz gerekiyor(du). Hızlı uygulama geliştirme(Rapid Application Development- RAD) geleneksel programlama araçlarıyla ve prgramcının yetenekleriyle çözüm bulunacak bir mesele değil. Artık programlama dilleri, dille birlikte gelen kütüphaneler ve bunlar hakkındaki dokümantasyonları ile birlikte değerlendiriliyor.


.NET ile birlikte programcının hizmetine sunulan 3400'den fazla sınıf, modern anlamda çok güzel bir geliştirme ortamı sunuyor. Bu sayede programlamları daha hızlı bir şekilde geliştirme imkanına sahip bulunuyoruz. .NET kullanarak yazdığımız ASP.NET, Windows Forms veya mobil cihazlar için geliştirdiğimiz bir uygulamayı birinden diğerine dönüştürmek işi çok kolay bir şekilde yapılabiliniyor. Bu sayede aynı anda hem windows hem de web uygulamaları geliştirmek çok hoşunuza gidecektir :).


.NET framework'unun bize sunduğu diğer güzel bir özellik ise platform bağımsızlığıdır. Artık yazdığınız Windows uygulamaları sadece Windows yüklü sistemlerde değil, .NET framework'unun kurulu olduğu tüm platformlarda çalışabilecektir. Her ne kadar şimdilik bu alt yapının sadece Windows versiyonuna sahip olsak da Linux grupları tarafından bu alt yapının Linux versiyonunu çıkartma yönündeki çabalar uzun bir süredir devam etmektedir.


Peki bunca hoş özellikleri bize sağlayan .NET alt yapısında program yazarken hangi dili veya dilleri kullanmak zorundayız? Bu konuda Microsoft çok radikal bir karar alarak gelecek için hazırlanmış yeni alt yapıda Common Language Runtime (CLR) ile uyumlu her .NET dilini kullanmamıza olanak sağlıyor. .NET ile gelen SDK'da C#,VB.NET ve Js.NET kullanarak program yazabiliyoruz. Diğer taraftan 30'un üzerinde programlama diliyle .NET uygulaması geliştirebilirsiniz.


CLR denen şey tam olarak nedir? .NET altyapısında programların çalışmasını kontrol eden ve işletim sistemi ile programımız arasında yer alan arabirimdir. Normalde yazdığımız programlar derlenirken makine diline çevrilirdi ve program bu şekilde işletim sistemi ile direkt bağlantı kurarak çalışırdı. Fakat platform bağımsız bir geliştirme ve yürütme ortamı istiyorsanız ne olacak? İşte tam bu anda CLR devreye girer ve .NET programlarını farklı platformlarda makineye ve işletim sistemine göre programımızı çalıştırır. Normalde bir Windows, Linux veya MACOS kurulu sistemler aynı programın kodunu çalıştıramazlar. Bu platformlar için programın ayrı ayrı yazılıp, onlara göre hazırlanmış derleyicilerde derlenmesi gerekir. Dünyada çok sayıda yaygın platform olduğunu düşünürsek, bunların herbiri için ayrı ayrı derleme işlemini tek bir işletim sisteminde yapmamız imkansız gibidir. Bu durumda çözüm , ortak bir aradil kullanmak ve herbir platform için bu aradile çevrilmiş programın kodunu çalıştıracak altyapıları hazırlamaktır.


Şimdi şu soruya sıra geldi: "İyi de .NET hangi aradili kullanıyor?" Sorumuzun cevabı MSIL(Microsoft intermediate Language) .NET platfomunda hangi dili kullanırsak kullanalım yazdığımız programın kodu direkt olarak makine diline değil de MSIL'e çevrilir. Bu sadece programı çalıştırdığımız sistemde kurulu olan CLR çalışma anında MSIL kodlarını çevirerek programımızı çalıştırır, çalışma anında derleme işlemini ise JIT derleyicileri (Just in Time compilers) üstlenir.


Gelecek makalemizde JIT'ler, MSIL language, CTS (Common Type System) gibi daha teknik konuları detaylı olarak ele almayı düşünüyorum. Sizlere kolaylıklar dilerim.


.NET'in CLR , CTS ve JIT derleyicileri ;


Önceki yazımızda "dot NET" platformu konusuna giriş yapmıştık. Burada ise daha detaylı olarak .NET kavramlarını inceleyeceğiz ve .NET'le Java'nın karşılaştırıldığı bir testin sonuçlarına yer vereceğiz.


.NET platformunda istediğimiz programlama dili ile program yazabileceğimizi önceki yazımızda söylemiştik. Bunun için tek şart, kullandığımız dilin .NET için yazılmış olan bir derleyicisine ihtiyacımız olduğudur. .NET uyumlu programlama dili oluştururken belirli standartlara uyulması gerekir. Bu standartlar CLS (Common Language Specifications - Dillerin ortak özellikleri) ile belirlenmiştir. CTS(Common Type System) ise veri tipleri, nesneler, arayüzler ve programlama dillerine ait özellikleri tanımlar ve CLS'in bir parçası olarak karşımıza çıkar. CLS'de tanımlanmış kurallara uymak şartı ile istersek kendi programlama dilimizi dahi geliştirebiliriz veya herhangi bir dili .NET platformunda uygulama geliştirmek üzere değiştirebiliriz.


CLR ,programlarımızı değişik şekilde derleyebilir. Varsayılan derleme türü JIT(Just IN TIME- çalışam anında derleme) 'dır. Program çalışırken daha önce derlenmemiş bir parçasına gelince hemen o kısmı da derler ve bunu hafızda chach'e koyar. Tekrar aynı program parçasını çalıştırmak gerekirse burayı hafızadan çalıştırır. Eğer RAM 'imizi yeteri kadar büyükse, programın tamamı derlenmiş ve hafızada depolanmış durumda olabilir. Bu durumda programımız çok hızlı çalışır.


Hafızamızın yeteri kadar büyük olmadığı durumlarda EconoJIT (Ekonomik JIT) derleyicisini kullanabiliriz. Bu derleyici ile programın derlenmiş kısımları hafızada depolanmaz ve her seferinde aynı program parçası derlenir. Tabi ki bu derleyici normal JIT'e göre programlarımızı daha yavaş çalıştırır. Ama RAM 'imizi çok daha az kullanır.


CLR ile gelen üçüncü derleyicimiz PreJIT(ön JIT derleyicisi) ise derleme işini program çalışmadan önce yapar ve tüm makine kodlarını bir yerde saklar. Çalışma anında çok hızlı olan programımız diğer JIT derleyicileriyle derlenmiş olanlara nazaran çok hızlı çalışır.


Kolayca görebileceğimiz birkaç noktaya da parmak basmak istiyorum. .NET ile yazdığınız programlar diğerlerine göre yavaş çalışır. Çünkü iki defa derleme aşamasından geçerler, program kodu MSIL'ye, MSIL ise makine koduna çevrilir. Diğer taraftan .NET ile programlarımız platform bağımsız olacak, .NET uyumlu herhangi bir dil ile program geliştirebileceğiz ve programımız CLR altında daha güvenli bir şekilde çalışacaktır.


.NET perfromans testi sonuçlara göre : Genelde C# Java'dan 3.30 kat daha hızlı. C# Visual C++ 6.0'dan ise 3.11 kat daha hızlı çalışıyor. Hatta VB.NET kodu VB 6.0'a nazaran 46.45 kat daha hızlı çalışıyor. :)


COM,COM+,ActiveX,OLE,MTS ve Windows DNA kavramları


COM, COM++, ActiveX, OLE ve DCOM gibi bir çok kelimeyi bir çok defa duymuşsunuzdur, COM/COM+ programlamaya başlamadan önce bu kavramları açığa kavuşturacağız. Aslında bu isim karmaşıklığı Microsoft firmasının devamlı kavramların isimlerini değiştirmesinden kaynaklanıyor, mesela OLE sözcüğünün tanımı üç defa değişmiştir. Bu yazının sonunda artık bütün bu kavramları öğrenmiş olacaksınız ve artık kafanız karışmayacak.


COM


Aslında bütün yukarıda bahsettiğimiz kavramlar COM teknolojisinin bulunmasıyla ortaya çıkmıştır.COM, programlama dilinden bağımsız, yazılım componentlerini(program parçacıkları) geliştirmek için belirlenen standartlar topluluğudur. Eğer bir programlama dili COM uyumlu ise bu spesifikasyonları uygulamış demektir. Şimdi asıl önemli olan Software Component dediğimiz program parçacıklarını anlayalım. Bir component, COM spesifikasyonlarına uyumlu herhangi biri dille yazılmış binary olan ve uygulamamızı geliştirmek için kullandığımız yapı bloklarıdır.Burda uygulama ve component kavramlarını birbirlerinden iyi ayırmak gerekir. Mesela MS Word programı bir uygulamadır. Fakat aynı zamanda MS Word bir componenttir.MS Word programının API(Application Programming Interface) dediğimiz özelliği sayesinde MS Wrodü rapor yazmak içinde kullanabilirsiniz.Yani MS Wordün API arayüzü sayesinde başka uygulamamızda rahatlıkla rapor yazmak için kullanabiliriz.Böylece COM teknolojisi ile kodların tekrar kullanılabilirliği sağlanmıştır. Bu sayede birbirinden bağımsız binary program parçaları oluşturup ana uygulamamızda veya başka uygulamalarda kullanabiliriz.Component ler bir sunucu içinde dağıtılır. Sunucu Dinamik Bağlı Kütüphaneler(DLL) şeklinde olabileceği gibi çalıştırılabilir(EXE) de olabilir. DLL tabanlı bir sunucua "in-process server" denir. Çünkü DLL ler istemci ile aynı proses içinde çalışırlar. Çalıştırılabilir sunuculara ise istemci ile farklı proseslerde çalışabildikleri için "out-of process server" denir. Farklı prosesleri birbirleri ile etkileştirmek çok zor ve komplike bir iştir ama dll gibi yapıları çalışan bir prosese bağlamak (link) COM teknolojisinin standartları çerçevesinde çok daha basittir.


Şimdi de COM teknolojisinin en önemli özelliği olan dilden bağımzsızlığını konuşalım. Yukarıda da dediğimiz gibi COM daki temel amaç farklı programlama dilleri ile yazdığımız parçacıkları rahatlıkla kullanmak.COM blokunun hangi dille yazıldığı veya sizin hangi ortamda COM blokunu kullandığınız önemli değildir.Eğer uzun zamandır programlama yaptıysanız muhtemelen farklı dilleri kullanarak oluşturulmuş bir uygulama görmüşsünüzdür.Her programlama dilinin kendine özgü yapısı vardır.Fonksiyon çağrımları, hata ayıklama işlemi ve en önemlisi veri tipleri her programlama dilinde farklıdır, bu yüzden farklı iki dili aynı uygulama içinde kullanabilmemiz nerdeyse imkansızdır. Peki insanların binary formda uygulamalarını programlama dilinden bağımsız nasıl paylaşabilirler.Bunun çözümü uygulama arayüz standartı oluşturmaktır. Bu standartlar binary seviyesinde iki programın nasıl iletişime geçeceğini açıklamalıdır.Programlama dillerini oluşturan firmalar dillerini bu standartlara uyumlu hale getirdiğinde artık istediğimiz dilde Component geliştirip istediğimiz ortamda kullanbiliriz. Tahmin ettiğiniz gibi COM standartları yukarıda bahsettiğimiz standartların tamamını kapsar.COM standartları uygulamaların binary düzeyde birbirleri ile nasıl ilişkiye geçeceğini tanımlar. COM çalışma prensibini daha iyi anlamak için aşağıdaki şemayı iyice inceleyin.


comgiris1.jpg



Microsoft gibi bir çok firmanın ürünler COM paketleri şeklindedir. Mesela Microsft firmasına ait Speech API leri ve DirectX COM paketleri şeklindedir. Bu sayede herhangi bir programdan bu paketler içindeki fonksiyonlara kolayca ulaşabiliriz.


COM teknolojisine benzer CORBA(Common Object Request Broker Architecture) teknolojiside mevcuttur. CORBA, COM teknolojisine konsept olarak çok benzemekle beraber COM dan farklı yönüde vardır. Bu farklardan en önemlisi CORBA nın başlangıçta farklı platformlar arası iletişimi kurmaya yönelik teknoloji olmasıdır. Oysaki her ne kadar şimdi COM bütün platformları desteklesede başlangıç olarak sadece Windows platformları hedeflenmiştir.


DCOM


DCOM kelimesi Distrubuted Component Object Model kelimelerinin kısaltılmasından gelir. DCOM, COM u ağ yapılarında kullanabilme özelliğine verilmiş özel bir addır. Aslına bakarsanız DCOM sözcüğü çok gerekli bir tanımlama değildir, zaten COM un temel amacı platformlardan(network ortamı dahil) ve programlama dillerinden bağımsız bir geliştirme ortamı sunmaktır, bu yüzden ağ yapısında kullanılan COM diye bir tanımlama yapmak çok gerekli değildir. Hatta siz bu sözcüğü şimdiden unutabilirsiniz bile :) DCOM un sağladığı en büyük özellik ise güvenliktir. İstemci ve Sunucunun aynı makinada olduğu çalışmalarda güvenlik önemli olmayabilir ama sunucunun başka makinalarda olduğu çalışma ortamlarında herşeyden öenmlisi sizde takdir edersinizki güvenliktir. DCOM un COM a kattığı en büyük şey dolyısıyla güvenliktir diyebiliriz. Şimdi diyeceksiniz madem DCOM bu kadar önemli neden az önce bu kelimeyi unutabilirsiniz dediniz. Evet, hala öyle diyorum siz bir programlama diline bir kütüphane eklediğinizde yeni bir dil oluşturmadan zenginleştirmiş olursunuz o dili, DCOM da bunu benzer birşeydir(teşbihte hata olmasın sakın).


MTS (Microsoft Transaction Server)


MTS, Microsoft firmasının geliştirdiği en önemli COM tabanlı teknolojidir. DCOM, dağıtık yapıdaki uygulama yapmamıza olanak sağlamıştı, MTS ise bunun en belirgin ve en önemli uygulamasıdır. Fakat malesef DCOM gibi , MTS de kötü isimlendirilmiştir. MTS(Microsoft Transaction Server) için en güzel isim COM uygulama sunucusu olurdu herhalde. Neyse madem bu ismi koymuşlar bizde bundan böyle MTS diye kullanacağız. Oracle gibi diğer firmalar bu tür uygulamalarına sunucu uygulaması adı vermiştir. "Transactions" olayı ise sadece MTS in yapabileceği işlerden biridir. MTS olmadan önce yapacağımız dağıtık uygulamalardaki veri güvenliğini sağlamak, transaction olaylarını ve kaynakları yönetmek için uzunca kodlar yazmamız gerekiyordu. MTS bize bu gerekli kodları yazmadan işimizi yapmamızı sağlıyor.

MTS ile Windows NT güvenlik API lerini direkt olarak kullanarak istediğimiz güvenlik önlemlerini alabiliriz. MTS in sağladığı en önemli faydası ise "çok kullanılabilirlik" tir. Mesela bir sunucu üzerinde bulunan COM parçacığına 10.000 kişinin aynı anda bağlandığını düşünelim.10.000 kullanıcı aynı anda bizim COM nesnesine ait bir referansı içerebilir fakat aslında aynı anda bu kullanıcılardan sadece birkaçı aynı anda COM nesnesinin bir metodunu çalıştırıyordur. Her kullanıcıya COM nesnesine ait bir referans verildiğini ve sadece ilgili nesneye ait metodun çağrılması sırasında gerçek nesnenin yaratıldığını düşünelim, bunu yapmak gerçekten güç bir iştir. MTS ile biz bu işlemleri rahatlıkla gerçekleştiririz.

Birde ilginç ama MTS in sağladığı şu iş vardır. Bildiğiniz gibi istemci/sunucu mimarilerinde sunucuya ait kaynakların sistemin kararlılığı için büyük önemi vardır. Mesela veritabanı bağlantılarının gerçekleşmesi diğer işlemlere göre daha uzun zaman alır. Ve aynı zamanda veritabanı bağlantıları maddi olarakta pahalıdır. Bildiğiniz gibi bazı firmalar veritabanı sistemlerini o sisteme yapılan bağlantı ile ücretlendirirler. Mesela veritabanına günde 1000 kişi bağlantı yapıyorsa 10 milyon, 100 bağlantı yapılıyorsa 1 milyon ödüyorsunuz, bu durumda sistem kaynaklarının maddi açıdan da önemi büyür. Mesela rastgele bağlantılar açmak mali açıdan şirketinizi güç duruma sokabilir. MTS bu konuda da bizi yalnız bırakmaz. Sisteme ait kaynakların boşa harcanmasını engeller. Bir örnek verecek olursak; MTS, OLEDB ve ODBC ile beraber çalıştığı için sunucuya yapılan bağlantılar için bir "bağlantı havuzu" oluşturulur. Yeni bir bağlantı oluşturulmak istendiğinde MTS sayesinde oluşturulan bağlantı havuzu kontrol edilir ve o an için işe yaramayan ve tekrar kullanılabilir bağlantı varsa yeni bir bağlantı açılmadan eski bağlantı üzerinden işlemlere devam edilir. Böylece hem gereksiz bağlantılar engellenmiş olur hemde maddi olarak tasarruf edilmiş olunur. Son olarak dağıtık yapıdaki sistemlerde farklı veritabanları üzerinde çalışıyorsak transaction olaylarını MTS sayesinde kolaylıkla yönetebiliriz. Transaction farklı sunucularda bulunan farklı veritabanlarında aynı anda senkronize bir çalışma şeklidir. Mesela bir banka hesabından başka bir hesaba para aktarırken farklı suncularda bulunması olası iki veritabanı ile işlem yapılır. İki işlemin de bitmeden bağlantının herhangi bir sebepten bozulması para transferinin gerçekleşmediğini gösteriri, bağlantının tekrar sağlanması durumunda bu işlemlerin kontrol edilmesi ve varsa hataların düzeltilmesi gerekir. Bu işlemleri MTS sayesinde gerçekleştiririz.


Windows DNA


Windows DNA, Windows Distrubuted interNet Applications Architecture kelimelerinin kısaltılmış halidir. Kısaca WinDNA, dağıtık Windows platformlarında dağıtık yapıda uygulamlar geliştirmek için geliştirilmiş bir modeldir.Bu fikrin temeli windows platformları için geliştirilen iş uygulamalarının temel olarak 3 mantıksal katmandan oluşturmak için oluşmuştur. Bu katmanlar kullanıcı arayüzü, uygulama ve veri depolamadır. Bu uygulamalar entegrasyon teknolojisi olarak COM u IIS, MTS ve IE kullanarak işlerin WWW ortamına aktarırlar. Ve elbette geliştirme ortamı olarakta Visual Studio kullanılır. Sakın Windows DNA nın satın alanıbilecek ve kurulabilecek bir program olarak algılamayın. Windows DNA sadece yukarıdaki söylediklerimizi içeren bir modelin ismidir.


COM+


COM+, COM teknolojisinin ikinci jenerasyonudur. COM teknolojisine yeni özellikler eklenerek dağıtık yapıda sınıflar içeren uygulamalrın geliştirilmesi kolaylaşmıştır. COM+, DCOM üzerine kurulmuş ve COMun son versiyonu olarak algılanabilir. COM+ ile, MTS ve işletim sistemi arasında sıkı bir bağ kurulmuştur. Aslında "MTS 3.0 + yeni özellikler = COM+ " şeklindeki bir denklem çok doğru olacaktır.


ActiveX


ActiveX, Microsft firmasının COM teknolojisini kullanarak geliştirmiş olduğu ve çoğunluka internette kullanılmak için geliştirilen programlara verilen addır. Üzgünümki bu isimlendirme diğerlerinden de kötü bir isimlendirme olmuştur. Mesela ben ActiveX başlıklı bir kitap hiç görmedim, çünkü ActiveX kavramı şimdilerde değişti ve insanların kafası karışmasın dieye kimse ActiveX başlıklı bir kitap yayınlanmıyor(istisnalar her zaman mevcuttur). ActiveX kavramı ilk çıktığında, internette kullanılan COM tabanlı teknolojilere verilen isim olarak bilindi. 1995 yılında Bill Gates internetin iyi birşey olduğunu görünce, Microsoft ActiveX kavramının internet ortamında aktif içerik transferinin sağlanmasına vermeyi uygun gördü. Terminolojik olarak aktif içerik, statik HTML sayfalarının aksine sunucuda bir programı çalıştıran içeriklerdir. Java Appletler ve ActiveX kontrolleri bu tür içeriklerdir. Daha sonra internet ile alakalı COM teknolojisine Active teknolojileri denmeye başlandı. Sonuna bir X koyarakta ismi daha çekici bir hale gtirdiklerini düşünüyorlardır. Ve nihayetinde internetle alakası olmayan bütün COM tabanlı teknolojilere ActiveX denmeye başladı ve isim amacında çıkmaya başladı. Mesela Visual Basic 6.0 ı açtığınızda ActiveX DLL ve EXE diye iki proje tipi görürsünüz. Bu proje tiplerinin açık bi şekilde internetle alakalı olmadığı görülmektedir. Gördüğünüz gibi ActiveX kavramı kısacık tarihi boyunca çeşitli amaçlara hizmet etmiştir. :) Bizde sizin kafanızdaki karışıklıkları silmek için bu yazıyı yazdık. Umarım azda olsa bir fikri sahibi oldunuz, son olarak yine çok kafa karıştıran OLE kavramına değineceğiz.


OLE(Object Linking and Embedding)


ActiveX ikinci bir defa kılık değiştirdi ve bu seferde OLE adını aldı. OLE, COM tabanlı teknolojilerden oluşan bir Birleşik Döküman(Compound ********) oluşturma teknolojisidir. Bunun en iyi anlamak için MS Word programını açın, sonrada MS Excel den bir tabloyu Word belgesinin içine kopyalayın.Göreceksinizki Word belgesinde bulunan menüler değişecek ve Exceldeki bir görünüme gelecek, sanki Word belgesi içinden bir Excell belgesi açmış gibi olduk. Eminim daha önce çoğumuzu bunun MS Word programının bir özelliği olduğunu düşünürdük. Halbuki öyle değil, bu OLE teknolojisinin en öenmli gerekliliğidir. Yani COM dilinde buna compound ********(birleşik belge) hazırlama denir. COM teknolojisi bu tür uygulamalar hazırlamak için çeşitli arayüzler sağlamaktadır. Visual C++ ta bu tip şablonlar oluşturmak için sihirbazlar mevcuttur. Kafanız karışmadan değinegim OLEDB kavramı compound ******** ile alakası olmayan COM tabanlı data erişim teknolojilerne verilen addır. Buna rağman başında OLE ekinin bulunması Microsoft firmasının bir handikapıdır. Bu yüzden eğer kafanızda hala bir takım sorular varsa hiç endişelenmeyin bu sizden değil Microsoftun kötü isimlendirmesinden kaynaklanıyor.

Bu yazımızın sonuna geldik. Birsonraki yazımızda Nesne Yönelimi, sınıflar, nesneler ve arayüzler hakkında geniş bilgi alacağız. COM teknolojisini anlamak için bu kavramlara ihtiyacımız olacak.​
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.