Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 13.12.2002
Okunma Sayısı : 92433
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 23.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 23.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 23.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 23.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C# ile DLL Kütüphaneleri Oluşturmak
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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 DLL’in 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 .NET’in 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
  • Yazılan Yorumlar
  • Yorum Yaz
KAS
26
2010
Elinize sağlık. Yeni başlayanlar için güzel bir makale.
EYL
10
2009
bir konu ancak bu kadar güzel anlatılabilir sefer hoca ellerine saglık yeni basladım ama tek sefer de anladım:) saygılarımla
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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