|
C# ile DLL Kütüphaneleri Oluşturmak |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu
yazımızda Visual C# geliştirme aracını kullanarak oluşturduğumuz sınıfları nasıl
DLL şeklinde derleyeceğimizi ve nasıl kullanacağımızı öğreneceğiz. Ve her zaman
olduğu gibi basit bir uygulumasınıda yapacağız.
Öncelikle DLLin ne demek olduğunu kısaca açıklayalım. Bildiğiniz gibi günümüzde
artan sektörel ihtiyaçlardan dolayı yazacağımız kod satırı sayısı günden güne
artmaktadır. Yıllar öncesinde DOS altında çalışan bir oyun yazmak belki en zor
işti ama şimdi (Yıl:2002) uyguluma geliştirme kavramı çok değişti. Temelde aynı
şeyleri yapmamıza rağmen yaptığımız programlardan çok şeyler bekler olduk. Artık
işlerimizi tek bir bilgisayardan bile halledemez olduk. Dağıtık yapıdaki sistemlerdeki
bilgisayarlarda çalışan programlar günümüzde ihtiyacı en çok hissedilen programlar
olmuştur. İnternet üzerinde çalışan programlar dağıtık yapıdaki programlamaya
en güzel örnektir. Yazılım alanındaki ihtiyaçlar arttıkça kod yazan programcının
da işi zorlaşmaktadır. Programcı daha fazla kod yazmak durumunda kalacağı için
belli bir süre sonra mesleğinden bıkma durumuna bile gelebilecektir. Bunun önüne
geçmek yine biz yazılımcıların görevidir diye düşünüyorum. Bu yüzden teknoloji
ne kadar gelişirse gelişsin yazacağımız kodları belirli bir ortalamada tutmamız
gerekir ki, bunuda şimdilik başarmış durumdayız.
İşte bütün bu nedenlerden ötürü yazacağımız kodları azaltmak için bir takım
teknolojiler geliştirilmiştir. Bu teknolojileri de geliştirenler mühendisler
ve programcılardır. Bu teknolojiler amacı bir sorunu çözmek için yazılmış olan
kaynak kodu tekrar kullanabilmek için onu tekrar yeniden yazmayı ortadan kaldırmaktır.
Amaç, önceden yazılmış kodları bir şekilde kaynak kodunu gizleyerek hem başkasının
kullanımına açmak hemde kendimizin tekrar kullanmasıdır. Tabi bu durumda önümüze
bir takım engeller çıkmaktadır. Bunlardan en önemlisi şudur: Farklı yapılara
sahip hatta farklı veri türlerine sahip olan dillerde yazılmış olan kaynak kodları
başka bir dilde nasıl kullanırız. Bu ilk başta zor ve imkansız olmasına rağmen,
eğer sistematik bir standartlaşmaya gidilirse ve her programlama dili bu standarda
harfiyen uyarsa sorunun çözülebileceği görülmektedir. İşte bu yüzden COM ve
CORBA gibi teknolojiler geliştirilmiştir. Bu teknolojiler herhangi bir dil ile
yazılmış olan kodların binary(mikroişlemcinin anlayacağı seviye) düzeyde birbirlerini
anlayacak standartları içermektedir. COM programlamadan anlamamız gereken ise
çeşitli diller ile yazılmış kodların bir takım işlemler sonucu kodların COM
standartlarına uygun hale getirilmesidir. Uygun hale getilmiş kodlar, her paltformda
farklı dosya formatlarında saklanır. En çok duyduğumuz formatlardan
biri de DLL lerdir. Bir DLL, tekrar kullanılabilen program parçalarından başka
bir şey değildir. DLL dediğimiz program parçacıkları tek başlarına bir iş yapmamasına
rağmen, yazdığımız çalıştırılabilir(exe gibi) programlarda onları kullanarak
işlemlerimizi kolaylaıştırırız. Herhangi bir dilde COM programlama yapabilmek
için o dile ait derleyicinin COM yada benzeri standarları destekliyor olması
gerekir. Günümüzde en çok kullanılan iki standat COM ve CORBA standartlarıdır.
COM ve diğer yan teknolojiler hakkında daha fazla bilgiyi http://www.csharpnedir.com/makalegoster.asp?MId=23
adresindeki makaleden öğrenebilirsiniz.
Bu yazımızda .NET ortamında kullanılan herhangi bir dilde kullanmak üzere bir
dll oluşturacağız. DLL i oluşturmak için Visual Studio.NET ortamını kullanacağız.
Yazacağımız dll in içerdiği standart, .NET ortamının çalışma zamanı bilgilerini
içeren ve yöneten CLR(Common Language Runtime) olduğu için dll olarak hazırladığımız
kütüphaneyi ancak CLR yi destekleyen bir dilde kullanmamız mümkün olacaktır.
Deyim yerindeyse .NET için component geliştirmiş olacağız. CLR yi desteklemeyen
bir dilde kullanabilmemiz için kütüphanemizi COM standarlarına uygun hale getirmemiz
gerekecektir. Bu konu başka bir yazımın konusu olacağı için burada değinmeyeceğim.
.NET ortamındaki CLR birimini daha iyi kavramak için bir örnek vermek istiyorum.
Bildiğiniz gibi VB.NET te Integer türünden tam sayıları belirten temel bir veri
türü vardır. C# ta bunun karşılığı ise int türüdür. Aslında çalışma zamanında
bu iki veri türüde tek bir veri türüne denk gelmektedir. Bu veri türüde System
isimalanında bulunan Int32(System.Int32) veri türüdür.Yani C# ta kullandığımız
int veri türü ile VB.NET te kullandığımız veri türü aslında çalışma zamanında
tek bir veri türü olarak algılanır. Bu eşleştirme işini sağlayan ise .NETin
CLR dediğimiz birimidir. Gördüğünüz gibi COM programlamanın getirdiği en büyük
özelliklerden biri olan tür uyumlaştırması CLR sayesinde mümkün hale gelmektedir.
O halde bizim .NET için component geliştrimemiz hiç ummadığımız kadar kolay
olmaktadır. .NET platformuna uyumlu dillerin gün geçtikçe çoğaldığını ve şu
anda popüler olan hemen hemen bütün dillerin .NET versiyonlarının çıktığını
düşünürsek component geliştirmenin artık çok zor ve kafa karıştırıcı bir iş
olmayacağı açıktır. Bu yazımdaki amaç component geliştirmeye adım atmak olduğu
için kısa bir uygulama ile yazımı bitireceğim.
Komponentimizi geliştirmeye başlamadan önce yapacağımız iş hakkında bilgi vereyim.
Amacımız karmaşık sayılarla ilgili basit 4 işlemleri yapan bir sınıf tasarlayıp
bunu dll şeklinde paketledikten sonra başka programlar içerisinde bu sınıfı
kullanarak uygulama yapmak olacaktır. Dll ve uygulama programımızı yazmak için
Visual Studio .NET i kullanacağız. Tabi siz isterseniz herhangi bir text editörünü
kullanıp C# ın komut satırı derleyicisi ile kodu derleyebilirsiniz.
SINIFI TASARLAMAK
Visual Studio.NET i çalıştırdıktan sonra açacağımız proje tipi aşağıdaki şekilden
de görüldüğü gibi "Class Library" olacaktır. Dilimiz ise tabiki C#.
Bu ekrana ulaşmak için File->New->Project menüsünü
kullanın. Proje tipi olarak Visual C# template olarak ise Class Library
seçtikten sonra projemize uygun isim verip OK tuşuna baslım.
using
System;
namespace
KarmasikSayi
{ public class Complex { public Complex() {
} }
}
|
Gördüğünüz
gibi .NET bizim için ilk kodları oluşturdu. Daha önceden uygulama geliştirdiğimiz
ortamlardan bir farkının olmadığını göreceksiniz. Temel girdi/çıktı işlemleri
için System isim alanına referans veriyoruz. Sınıfımıza diğer uygulamalarda
kullanmak için bir isimalanı ekliyoruz ve başlıyoruz kodumuzu yazmaya. Complex
isimli veri türümüzün iki tane private veri elemanı olacak.Bunlar "re"
ve "im" olacak. Bunlar complex sayımızın reel ve sanal kısımlarını
temsil edecek. Sınıfımızın toplama, çıkarma, çarpma ve bölme gibi temel işlemleri
yapan 4 tane üye fonksiyonu olacaktır.
Sınıfımızın temelde 4 işlevi olmasına rağmen sınıfın üye fonksiyonları 4 tane
değildir. Bazı üye fonksiyonlarımız sınıfın kurucu(constructor) üye fonksiyonları
olduğu gibi bazıları ise override(aşırı yüklenmiş) edilmiş fonksiyonlar olacaktır.
Öncelikel sınıfımızın kurucu fonksiyonlarından bahsedelim; İki tane kurucu fonksiyonmuz
olacak.Birisi hiç bir parametre almayacak ve Complex sayının reel ve sanal kısmını
sıfır değerine eşitleyecek. İkinci kurucu fonksiyon ise verilen parametre değerlerini
Complex sayının ilgili kısmına(reel ve sanal) atayacaktır. Bu iki fonksiyonun
prototipleri aşağıdaki gibidir.
public Complex() public Complex(double reel, double
sanal)
Şimdide topla() fonksiyonunu ele alalım. Bu fonksiyonu iki şekilde kullanabilmemize
imkan sağlıyacağız.
1-) Kendisini çağıran Kompleks Sayıya parametresi ile verilen Komplek Sayıyı
toplayıp yeni bir kompleks sayı olarak geri döndürecektir.Bu üye fonksiyonunun
prototipi aşağıdaki gibidir.
public
Complex Topla(Complex operand)
2-) Oluşturulan iki kompleks sayıyı + operatörü ile direkt toplayabilmek için
operator+ fonksiyonunu oluşturacağız. Amacımız aşağıdaki gibi bir kullanımı
legal hale getirmektir.
Complex
sayi1 = new Complex(10,20); Complex sayi2 = new Complex(2,2); Complex sayi3 ; sayi3 =
sayi1 + sayi2;
Operator+ fonksiyonunun prototipi ise aşağıdaki gibidir.
public
static Complex operator+(Complex operand1, Complex operand2)
Çıkarma, çarpma ve bölme işlemleri içinde aynı fonksiyonları yazarak basit ama
iş yapan bir sınıfım oluşacaktır. Tabi karmaşık sayılar ile bölme ve çarpma
işlemlerinin matematiksel olarak nasıl yapıldığını biliyorsunuz varsayıyorum.
Son olarak sınıfımızın hoş bir üye fonksiyonu daha olacak. Bu da sınıfımızın
temsilk ettiği complex sayıyı , bildiğimiz karmaşık sayı formatında ekrana basacaktır.
Karmaşık sayı formatı unutanlar için aşağıdaki gibidir.
reel +/- j*sanal ; Örnek 3+j2
Tabi burda eğer sayının sanal kısmı negatifse, formatımızı 3-j2 şeklinde ayarlıyoruz.
Bütün bu işlemleri Yazdir() isimli üye fonksiyonla yapacağız.
Bu kısa bilgileri verdiktan sonra aşağıdaki kodu inceleyebilirsiniz.
using
System;
using KarmasikSayi;
namespace KarmasikSayi
{
public class Complex
{
private double re;
private double im;
public double Reel
{
get{return re;}
set{re =
value;}
}
public double Sanal
{
get{return im;}
set{im =
value;}
}
public Complex()
{
Reel=0;
Sanal = 0;
}
public Complex(double r,double s)
{
Reel=r;
Sanal = s;
}
public Complex Topla(Complex Operand)
{
double reel_toplam = Reel + Operand.Reel;
double sanal_toplam = Sanal + Operand.Sanal;
Complex toplam = new Complex(reel_toplam,sanal_toplam);
return toplam;
}
public static Complex operator+(Complex Operand1,Complex Operand2)
{
double reel_toplam = Operand1.Reel+Operand2.Reel;
double sanal_toplam = Operand1.Sanal+Operand2.Sanal;
Complex toplam = new Complex(reel_toplam,sanal_toplam);
return toplam;
}
public Complex Cikar(Complex Operand)
{
double reel_fark =
Reel - Operand.Reel;
double sanal_fark = Sanal - Operand.Sanal;
Complex sonuc = new Complex(reel_fark,sanal_fark);
return sonuc;
}
public static Complex operator-(Complex Operand1,Complex Operand2)
{
double reel_fark = Operand1.Reel - Operand2.Reel;
double sanal_fark = Operand1.Sanal - Operand2.Sanal;
Complex sonuc = new Complex(reel_fark,sanal_fark);
return sonuc;
}
public Complex Carp(Complex Operand)
{
double yeni_reel =
Reel*Operand.Reel - Sanal*Operand.Sanal;
double yeni_sanal = Reel * Operand.Sanal + Sanal*Operand.Reel;
Complex carpim = new Complex(yeni_reel,yeni_sanal);
return carpim;
}
public static Complex operator*(Complex Operand1,Complex Operand2)
{
double yeni_reel = Operand1.Reel*Operand2.Reel - Operand1.Sanal * Operand2.Sanal;
double yeni_sanal =
Operand1.Reel * Operand2.Sanal + Operand1.Sanal *
Operand2.Reel;
Complex carpim = new Complex(yeni_reel,yeni_sanal);
return carpim;
}
public Complex Bol(Complex operand)<
br>
{
double
Payda;
Payda = operand.Reel*operand.Reel + operand.Sanal*operand.Sanal;
Complex pay = new
Complex();
Complex temp = new
Complex(operand.Reel,-1*operand.Sanal);
pay = this*temp;
double yeni_reel = pay.Reel / Payda ; double yeni_sanal = pay.Sanal / Payda
; Complex sonuc = new Complex(yeni_reel,yeni_sanal); return sonuc;
}
public static Complex operator/(Complex operand1,Complex operand2)<
br>
{
double Payda;
Payda = operand2.Reel*operand2.Reel +
operand2.Sanal*operand2.Sanal;
Complex pay = new
Complex(); Complex temp = new
Complex(operand2.Reel,-1*operand2.Sanal);
pay =
operand1*temp; double yeni_reel = pay.Reel / Payda ; double yeni_sanal = pay.Sanal / Payda
; Complex sonuc = new Complex(yeni_reel,yeni_sanal); return sonuc;
}
public void Yazdir()
{
if
(Sanal > 0)
Console.WriteLine("{0} + j{1}",Reel,Sanal);
else
if (Sanal < 0)
{
double yeni_sanal = -Sanal;
Console.WriteLine("{0} - j{1}",Reel,yeni_sanal);
}
else
Console.WriteLine("{0}",Reel);
}
}
}
|
Gördüğünüz
gibi DLL oluşturmak için yazdığımız kaynak kodun main işlevi olmayan bir uygulamadan
farkı yok. Burda en önemli olan şey sınıfımızı bir isimalanı içine alarak başka
modüllerden kullanımını sağlamaktır.
Sınıfımızı yazdıktan sonra Build -> Build KarmasikSayi
menusunu yada Build -> Build Solution menüsünü
seçerek DLL dosyamızı oluştururuz. Eğer komut satırı derleyici kullanıyorsak
dll kütüphanesi oluşturmak için komut satırına aşağıdaki ifadeleri yazarak enter
tuşuna basın. Bu işlem ile derleyiciye çalıştırılabilir bir dosya yerine dll
şeklinde bir kütüphane oluşturulacağı söyleniyor.
Eğer komut
satırı derleyicisini kullanıyorsanız komut satırına aşağıdakileri yazarak dll
dosyanızı oluşturabilirsiniz.
csc /target:library KarmasikSayi.cs
Build işlemi gerçekleştikten sonra projemizin bulunduğu dizin içinde
bulunanBin->Debug klasörünün içinde KarmasikSayi.dll isimli bir dosya oluşacaktır.
Bu dosyayı şimdi herhangi bir yere kopyalayıp dll içinde bulunan Complex sınıfına
istediğimiz .NET dili ile ulaşabiliriz. Tek yapmamız gereken yeni bir proje
açıp aşağıda belirteceğim işleri takip etmektir.
SINIFI KULLANMAK
Öncelikle Visual Studio ile yeni bir Console Uygulaması yaratıp Visual Studio
ortamını yazdığımız dll den haberdar etmemiz gerekir.
Bunun için yanda gördüğünüz gibi Project->Add Reference menülerini kullanarak
aşağıdaki pencerenin gelmesini sağlayın.
Bu pencerede kırmızı alanlarla belirtilen kısımlara dikkat ederseniz DLL dosyamısın
yerini göstermek için Browse tuşunu kullanıyoruz. Sınıfımız sadece .NET çalışma
zamanını desteklediği için yukarıdaki sekmelerden .NET sekmesinin seçilmiş olmasına
dikkat ediniz. İşlemlerimizi yapıp OK tuşuna bastıktan sonra artık gönül rahatlığıyla
Complex sınıfın kullanabiliriz. Tabi bu sınfı kullanmaya başlamadan önce aşağıdaki
deyimi kaynak kodumuzun en başına eklememiz gerekir.
using KarmasikSayi; // sınıfımız tasarlarken oluşturduğumuz
isim alanı
Şimdi aşağıdaki kodu yazarak sınıfımızın nasıl çalıştığını kontrol edin ve sınıfımızı
dahada geliştirmek için yeni özellikler ekleyin. Mesela karmasik sayının geometrik
ifadesini oluşturan (büyüklük ve açı cinsinden) yeni işlevler ekleyebilirsiniz.
using
System;
using KarmasikSayi;
namespace
dll_makale
{
class Class1
{
static void Main(string[] args)
{
Complex x = new Complex(1,3);
Complex y = new Complex(-2,4);
Complex z = new Complex();
z = x/y;
z.Yazdir();
}
}
}
|
Bir sonraki
yazımızda daha detaylı ve daha karmaşık sınıflar tasarlayacağız. Bu makale ile
ilgili kaynak kodları ve proje dosyalarını www.csharpnedir.com/kaynakkod.asp?cat=cs
sayfasından bulabilirsiniz.
Makale:
C# ile DLL Kütüphaneleri Oluşturmak C#, Visual C# ve .NET Sefer Algan
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|