Respond needs javascript to run. To find out more click here
Projelerim » Sayfa 6 » Serdar Demir
RSS
 

Archive for the ‘Projelerim’ Category

C#’ta reflection kullanımı

06 Mar

C# ile kod yazarken hep modüler programlamayı merak ederdim pek de kaynak yok bu konuda. Programlarımda dll ile çalışmak ve ilerde programın geliştirilmeye açık olması buna örnek olarak update veya eklentileri örnek verebiliriz.

Siz bir dll oluşturuyorsunuz başkası sizin dll nizi kopyalarak kendi programında kullanabiliyor. Modüler programlama denen şey bu heralde :) Aslında bu konuya yoğunlaşmam sinan arkadışım hala ne işe yaradığını çözemediğim Toplu adlandırıcı programının betasını :) incelememden sonra olmuştur.

Reflection sınıfı sayesinde .net ile yazılmış olan bir dll in bütün metodlarını kullanabilirsiniz ve hakkında bilgi sahibi olabiliriz. Şimdi basit bir örnek olarak adonet ile veritabanına bağlantı işlemini dll ile yapacağız Sql veritabanına bağlanmaya yarayan dll mizi kullanarak server adı ve veritabanı adını parametre olarak gönderip veritabanına bağlanacağız artık bu dll yi kullanarak sqlconnectionlar connecting stringlerle ugraşmayacaksınız :) bunu visual studio ile Reflection kütüphanesini kullanarak yapacağız. Öncelikle kütüphanemizi ekleyelim.

using System.Reflection;

Biz projemize dışarıdan bir dll ekleyeceğiz bu arada dll miz çalışma zamanında eklenecek bu bizim için önemli :)

Assembly asm = Assembly.LoadFile(@"C:\Users\serdar\Baglanti.dll");
Type[] tipimiz = asm.GetTypes();
ConstructorInfo[] ci = tipimiz[0].GetConstructors();
object obj = ci[0].Invoke(null);
MethodInfo mi = tipimiz[0].GetMethod("SqleBaglan");
object nesne = mi.Invoke(obj, new object[] { textBox2.Text, textBox1.Text });

Assembly Reflection kütüphanesine ait sınıf dll ve exe leri projemize yüklememizi sağlıyor.

Yukarıdaki kodu click olayına yazıyoruz.

1. adımda dll mizi çalışma zamanında yüklüyoruz.

2.adımda ise dll miz içerisindeki classların tiplerinin dizisini alıyoruz burda dizi yapmayıp asm.gettype(“ClassA”); diyebilirdik.

3. adımda ise kurucu fonkiyonumuzu alıyoruz birden fazla constructor olabilir bilgiğimiz gibi default constructor vb..

4. adım biraz karışık bu adımı ClassA yeni=new ClassA(); gibi yorumlayabiliriz yani o nesneden bir tane Default constructor oluşturmamızı sağlıyor.

5. adım 2 adımda classımızın tipini (adını) almıştık bu adımda bu tipin method bilgilerini alıyoruz. Method ismini biliyorsak burdaki gibi direk girebiliriz yada method dizisine atarak method ismine ulaşabiliriz.

son adımda ise o metodu çağırıyoruz  textbox 1 ve textbox 2 den parametleri göndererek.

Aşağıda da dllmizin içeriği

public void SqleBaglan(string veritabani,string server)
        {
            SqlConnectionStringBuilder ayar = new SqlConnectionStringBuilder();
            ayar.DataSource = server;
            ayar.IntegratedSecurity = true;
            ayar.InitialCatalog = veritabani;
            SqlConnection con = new SqlConnection(ayar.ConnectionString);
            con.Open();
            MessageBox.Show("connection open");
        }

Not: Refactor programını kullanarak exe ve dll dosyalarının methodları parametleri sınıfları hakkında bütün bilgileri kolayca kullanabilirsiniz (bi ne vi dll okuyucu diyebiliriz )

Refactor!

Refactor! for Visual Basic 2008 is a free plug-in from Developer Express Inc., in partnership with Microsoft, that enables Visual Basic developers to simplify and re-structure source code inside of Visual Studio 2008, making it easier to read and less costly to maintain. Refactor! supports more than 30 individual refactoring features, including operations like Reorder Parameters, Extract Method, Name Anonymous Type and many more!

Download Refactor! Now


 
No Comments

Posted in C#, Makaleler

 

C#’ ta uygulama kısayolu oluşturma

06 Mar

Kısayol SimgesiArkaplan-Resmi:com sitemi biliyor musunuz, bilmiyorum ? Eğer biliyorsanız bu site için yaptığım duvarkağıdı değiştiriciyi belki görmüşsünüzdür. Tee 10 ay önce yapmıştım o programı. Eksikleri çoktu hatta yeni bir sürüm üzerinde çalışıyordum. Bu arada eski sürümünü de güncelleyeyim dedim ki, şu yüzden: son zamanlarda indiren kişi sayısı anlayamadığım bir şekilde arttı. Bende yarım yamalak çalışan bir program kullanmasınlar diye eski sürümü güncelledim.

Yine başlangıç kısmı fazla uzun sürdü.

Sadete geleyim, programımın en büyük sorunu UAC engeline takılmasıydı. Çünkü ben programı Kayıt Defterinden başlangıç programlarına kendisini ekleyecek şekilde ayarlamıştım ve bu ayara erişmek için Yönetici izni gerekiyordu. Bugün düşündüm, bunu yapacağıma daha az gürültülü bir yol daha var: Başlat menüsünde ki Başlangıç içerisinde link yerleştirmek. Evet, konuya yaklaştığımızı sizde farketmişsinizdir. Bende araştırdım “bu nasıl yapılır?” diye. Karşıma iki yöntem çıktı, birincisi daha profesyonelce, ikinicisi ise gayet basit. İkisini de anlatayım.

1. Yol

Windows içerisinde ki bir COM nesnesinden faydalanıyoruz. Öncelikle Solution Explorer’ da References’ ın içerik menüsünden Add Reference’a tıklıyoruz. Sonra bu listeden Windows Script Host Object Model’ i seçiyoruz.

Referans EklemeReferans Ekle Formu

Daha sonra aşağıdaki kodları kullanarak kısayolumuzu oluşturabiliriz.
En önce kütüphaneyi dosyaya dahil edelim :

  1. using IWshRuntimeLibrary;

Daha sonra;

  1. private WshShellClass WshShell;
  2. private void btnShortcut_Click(object sender, System.EventArgs e)
  3. {
  4. WshShell = new WshShellClass();
  5. // Kısayol değişkeni
  6. IWshRuntimeLibrary.IWshShortcut MyShortcut;
  7. // Kısayolu oluşturacağımız yolu seçiyoruz. (Kısayolun yeri)
  8. MyShortcut = (IWshRuntimeLibrary.IWshShortcut)WshShell.CreateShortcut(@”C:\MyShortcut.lnk”);
  9. // Kısayolun hedefini belirliyoruz.

10.  // Burada uygulamanın çalıştırılabilir dosyası gösteriliyor. İsterseniz başka dosyanın yolunuda verebilirsiniz

11.  // Örnek : MyShortcut.TargetPath = @”C:\Windows\notepad.exe”;

12.  MyShortcut.TargetPath = Application.ExecutablePath;

13.  // Kısayol için açıklama. Çok gerekli değil ama koysanız iyi olur

14.  MyShortcut.Description = “Launch My Application”;

15.  // Kısayol simgesini belirtiyoruz. Bu satırı koymazsanız kısayolun simgesi uygulamanın simgesi ile aynı olur

16.  MyShortcut.IconLocation = Application.StartupPath + @”\app.ico”;

17.  // En son kayıt işlemi

18.  MyShortcut.Save();

19.  }
Birinci adım bu kadar.

2. Yol

Bu adım biraz daha kolay. Şöyle ki; normalde uygulamalar için kullanılan kısayol dosyaları(.lnk) çok karmaşıktır. Oysaki internet kısayol dosyaları(.url) çok basittirler. Bizde bir internet kısayolu oluşturacağız ama bu kısayolunun gideceği yer bilgisayarımızdaki bir dosya olacak. Evet yanlış duymadınız o bizim istediğimiz uygulama dosyası olacak.
Sizin için direkt kullanabileceğiniz bir fonksiyon vereyim

  1. private void KisayolOlustur(string link, string target)
  2. {
  3. string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
  4. if (File.Exists(linkName))
  5. {
  6. return;
  7. }
  8. using (StreamWriter writer = new StreamWriter(linkName))
  9. {
  10. writer.WriteLine(“[InternetShortcut]“);
  11. writer.WriteLine(“URL=file:///” + target);
  12. writer.WriteLine(“IconIndex=0″);
  13. string icon = app.Replace(‘\\’, ‘/’);
  14. writer.WriteLine(“IconFile=” + icon);
  15. writer.Close();
  16. }

17.  }
Kullanımı:

1.  KisayolOlustur(“Kısayol dosyasının konumu”, “Kısayol dosyasının hedefi”);
İşte bu kadar. Umarım işinizi görür. Eğer işinizi görürse beni de görürsünüz artık.

 
 

Singleton Design Pattern

06 Mar

Tasarım Desenleri (Design Pattern) ilk duyduğunuzda aklınıza gelen Kullanıcı Arayüzü ile alakalı bir terim değildir. Bunlara, uygulama kodları için oluşturulmuş kalıplardır diyebiliriz. İlk bakışta insana garip gelebiliyor ama öğrenmekten zarar çıkmaz. Belli olmazi bir gün lazım olur.
Baştan uyarayım bu makaleyi anlayabilmek için nesneye yönelik programlamayı bilmeniz gerekmektedir.
Burada Singleton deseninden bahsedeceğim. İlk önce şunu açıklığa kavuşturalım. Bu nerelerde lazım olabilir.
Bir örnekle açıklamaya çalışayım. Bir seçenek yönetici sınıfımız olsun. Bu sınıf uygulamamızda kullanacağımız işlemler için kullanıcı seçeneklerini yöneten özelliklere(property) sahip olsun.

Örneğin:

  1. public string SiteAdresi { getset; }
  2. public int GuncellemePeriyodu { getset; }
  3. // vb…

Seçenek yöneticimiz ile bu değişkenlerin değerlerine ulaşıp uygulamamızda kullanabiliyor ve istersek değiştirebiliyoruz. Haliye bu değişkenlerin değerlerinin bir yerde tutulması gerekir. Bir dosya veya kayıt defteri gibi. Eğer bu seçenek yöneticisi sınıfından birden fazla nesne oluşturulsa, bir nesnenin yaptığı değişiklik diğer nesneler tarafından bilinmeyeceği için karışıklığa yol açabilir. Örneğin bir seçeneğin değerindeki değişikliği sadece değişikliği yapan nesne bilecektir. Diğer nesneler hala eski değeri vereceği için diğer nesnelerin kullanıldığı tarafta hatalar meydana gelebilir. Biraz karıştı gibi değil mi? Bende farkındayım ama toparlamaya çalışacağım.
Bir yerde bir kitap düşünelim. Bu kitap bizim seçenekleri kaydettiğimiz dosya yerine geçecek. Bu kitapta yazanları okuyup bize bildiren 3 kişi olsun. Ayrıca bu kişiler istersek kitapta yazanları değiştirebiliyor. A, B ve C kişileri bu kitabı birer kere okuyup hafızalarına aldıklarını ve sorduğumuzda ezberden cevapladıklarını düşünelim. Seçenek dosyasının okunup değerlerin hafızaya alınması gibi. Biz A kişisine kitaptaki bir yeri değiştirmesini söylediğimizde, B ve C kişileri kitabı bir daha okuyana kadar bu değişiklikten haberdar olmayacaklardır ve sorduğumuzda kitabın eski haline göre cevap vereceklerdir. Bu da karışıklığa yol açacaktır. Oysaki sadece bir kişi bu işten sorumlu olsaydı böyle bir sorun olmazdı.

İşte Singleton bu gibi durumlar kullanılan bir desendir. Bu desende oluşturulan sınıfların sadece bir nesnesi olabilir. Diğer nesnenin oluşturulması programatik olarak engellenir. Yani istense de oluşturulamaz.
Şöyle bir kod düşünelim:

  1. class SecenekYoneticisi
  2. {
  3. public SecenekYoneticisi();
  4. public string SiteAdresi { getset; }
  5. public int GuncellemePeriyodu { getset; }
  6. public void SecenekleriOku();
  7. public void SecenekleriGuncelle();
  8. }

Bu sınıfı sadece bir nesne üretmesine izin verecek şekilde nasıl ayarlarız. Öncelikle bu sınıfın kullanabileceğimiz tek nesnesini oluşturalım. Sonra diğerlerinin oluşturulmasını engelleriz. Sınıfın içerisine sınıfın kendi türünden static ve private bir değişken koyalım.

  1. private static SecenekYoneticisi _yonetici;

Sonra bu private değişkene ulaşabilmek için static bir property tasarlıyalım:

  1. public static SecenekYoneticisi Yonetici
  2. {
  3. get
  4. {
  5. if (_yonetici = null)
  6. _yonetici = new SecenekYoneticisi();
  7. return _yonetici;
  8. }
  9. }

Yukarıdaki kodu incelersek; oluşturduğumuz özellik sadece değişkeni okumamızı sağlıyor. Atamaya izin vermiyor. get bloğunda _yonetici değişkeninin null olup olmadığını kontrol ediyoruz. Eğer boş ise içerisine bir SecenekYoneticisi atıyoruz ve o haliyle geri döndürüyoruz. Boş değilse zaten önceden atanmış bir SeceneYoneticisi vardır ve tekrar atamaya gerek yoktur.

Buraya kadar tamam. Peki başka bir nesne oluşturulmasını nasıl engelleyeceğiz. Bunun için çok küçük bir hile mevcut. Sınıfımızın yapılandırıcısını private olarak yazacağız. Yani:

  1. // public SecenekYoneticisi();
  2. private SecenekYoneticisi();

Bu sayede bu sınıftan nesne üretmek sadece sınıf içerisinde mümkün olabilir. Eğer C++ kullanıyorsak private yapılandırıcıya izin vermeyebilir. Önemli değil, protected olarak işaretlemekte aynı sonucu verecektir.

Sınıfımızın son haline bir bakalım:

  1. class SecenekYoneticisi
  2. {
  3. private SecenekYoneticisi _yonetici;
  4. private SecenekYoneticisi();
  5. public string SiteAdresi { getset; }
  6. public int GuncellemePeriyodu { getset; }
  7. public void SecenekleriOku();
  8. public void SecenekleriGuncelle();
  9. public static SecenekYoneticisi Yonetici
  10. {
  11. get
  12. {
  13. if (_yonetici = null)
  14. _yonetici = new SecenekYoneticisi();
  15. return _yonetici;
  16. }
  17. }

18.  }
Eğer bu sınıfı kullanmak istersek oluşturduğumuz Yonetici özelliğini kullanmamız yeterli.

1.  SecenekYoneticisi.Yonetici.SecenekleriGuncelle();

Elimden geldiğince anlatmaya çalıştım ama böyle bir konu gerçekten ihtiyaç duyana kadar tam olarak anlaşılamayacaktır. Bol bol proje yapmaya çalışın. Her projeniz size yeni birşey öğretsin. Yazım hataları var ise affola. İyi günler dilerim.

 
No Comments

Posted in C#, Makaleler