Pages

.Net Debug – Trace Kullanımı

Nedir Bu Debug ve trace?
Debug ve trace sınıfları uygulamamızı geliştiriken veya çalışma aşamasında bilgi mesajları vermemizi sağlar.System.Diagnostics ad alanında bulunurlar. Visual Studio nun output bölümünde çıktıları görüntülenir. Ayrıca çıktılar listener e gönderilir.Debug ve Trace in listeneri aynıdır.
Debug Sınıfı uygulamaları debug modda derlenirken ,trace sınıfı ise hem debug hem  release modda derlenen uygulamalarda kullanılır.

image

Debug ve trace sınıfının metodları:
Write : Verilen metni Listeners koleksiyonuna yazar.
WriteLine : Verilen metni Listeners koleksiyonuna yazar. Ve bir alt satıra geçer.
WriteIf: Eğer verilen Boolean koşulu True değerini taşıyor ise metni Listeners koleksiyonuna yazar.
WriteLineIf: Eğer verilen Boolean koşulu True değerini taşıyor ise metni Listeners koleksiyonuna yazar. Ve bir alt satıra geçer.
Assert : Boolean türündeki şart karşılanmadığı zaman bir mesaj kutusu ile kullanıcıya bilgi verir. Gelen mesaj kutusundaki seçenekler ile program sonlandırılabilir. Ayrıca Listeners koleksiyonunada ilgili mesajı yazar.
Fail: Assert metod ile aynı işlemi yapar. Tek farkı herhangi bir koşula bakmaz, kodun yazıldığı satıra gelindiğinde Assert metodundaki gibi uyarı mesajı görüntülenir.

Şimdi bir örnek yapalım. Aşağıda output da hem debug hem de trace sınıflarımızın çıktılarını görüyoruz.Çünkü dikkat edin uygulamamızı debug modda derledik.
Dikkat: System.Diagnostics isim alanını eklemyi unutmayın.

image

image  Release modda çalıştırınca debug çıktılarını göremeyiz.

image int bomba=3;
Trace.Fail( "İbrahim Özbey ");


Mesela uygulama bu satıra gelince soldaki çıktıyı verir.

Listener
Debug veya Trace sınıfları kendilerine gelen verileri biriktirerek bir yada daha fazla kaynağa gönderebilirler.Bunuda TraceListener sınıfı tarafından yaparlar.


Dikkat : Listeners koleksiyonu her zaman bir öğeye sahiptir. Bu öğe DefaultTraceListener sınıfından türetilmiş olan bir nesnedir.output ekranına veri iletiminde kullanılır bu listener.

.NET Framework temel sınıf kütüphanesi Trace ve Debug sınfılarının kaydedilmesi için iki adet sınıf barındırmaktadır.Bunlar EventLogTraceListener ve TextWriterTraceListener sınıflarıdır.

TextWriterTraceListener :
Bu sınıf debug ve trace den gelen bilgileri herhangi bir stream üzerinden göndermemize yarar.
image

image 

Yukarı daki örnek te önce Filestream nesnemizi oluşturuyoruz.Sonra TextWriterTraceListener nesnemizi oluşturuyoruz ve kulanacağı stream i belirtiyoruz. Sonra Lstenerimizi ekliyoruz.
sonra debug ve trace bilgilerimizi yazıyoruz.Bu satırlar output ekranına yazılıyor ayrıca listener sayesinde mylog.txt Dosyamıza yazdırılıyor.

EventLogTraceListener:
trace ve debug dan aldığı bilgiyi Windows un eventlog una yönlendir.

image

burada ise Önce Eventlog da mylog adlı bölüm yoksa create ediyoruz.Sonra Eventlog nesnesi oluşturuyoruz. EventLogTraceListener sınıfına Eventlog dan oluşturduğumuz nesneyi ekliyoruz ve Oluşturduğumuz EventLogTraceListener ı listener koleksiyonuna ekliyoruz.Yine Trace ve Debug bilgilerimizi yazıyoruz. bunlar yine output ekranında görünecekler fakat bu kez ayrıca Windows un olay görüntüleyicisinde de görünecekler.
image

TraceListener sınıflarını config dosyasından yönetmek:
Aşağıda remove tagı Default olarak gelen DefaultTraceListener i kaldırır ve add tagları ile bizim kullanacağımız listener çeşitlerini ekleriz.Name ile nesne ismimizi type ile tipini ve initializedata ile başlangıç kaynağımızı gösteririz.
kullanımı ise Direk Kodumuza
Trace.WriteLine(“Appconfig dosyasındaki ayarlarımızı kullandık :D”); satırı yazdık ve App.Config deki ayarladığımız özellikleri kullandık.

image

TraceSwitch:

buraya kadar debug trace sınıflarının çıktılarını aldık ama sınıflandırmadık bu sınıflandırmayı ise traceswitch ile yapacağız.

  • Error: Sadece hata mesajlarını listenere gönderir. tam sayı karşılığı 1 dir
  • off: Hiç mesaj göndermez. tam sayı karşılığı 0 dır.
  • warning : Hata mesajları ve uyarıları gönderir. tamsayı karşılığı 2 dir.
  • info : Hata mesajları,uyarılar,kısa açıklayıcı bilgiler gönderir . tam sayı karşılığı 3 dür.
  • verbose: Hata mesajı ve uyarıları , sistemin ayrıntılı çalışma biçimini gönderir. karşılığı 4 dür.

iki türlü kullanımı vardır ya App.config de yar yaparız yada kodumuzun içinde.
Aşağıdaki öernekte önce traceswitch oluşturuyor. Sonrada Level ini ayrlıyoruz.Sonrada şart sağlıyorsa yazıyoruz.

private void button6_Click(object sender, EventArgs e)
        {
            TraceSwitch ts = new TraceSwitch("ibrahim "," açıklama");
            ts.Level = TraceLevel.Verbose;
            Trace.WriteLineIf(ts.TraceInfo==;False,"Listenere göndereceğimiz trace in level ini verbose olarak ayarladık");
        }

yada web.config de ufak bir ayar yaparak bu işi yine yapabiliriz. Aşağıda ki kodda value değeri yukarıda verdiğimiz trace özelliklerinin tam sayı değeridir. hangisini kullanmak istiyorsak onun değerini yazmalıyız.bu kodu web config dosyasına

<system.diagnostics>
  <switches>
    <add name="BenimSwith" value="1"/>
  </switches>


bu kodu da cs dosyamıza yazarsak. web.config kullanrak yapmış oluruz trace imizin level ayarını.

TraceSwitch ibo = new TraceSwitch("BenimSwith", "Açıklama");             Trace.WriteLineIf(ibo.TraceError == true, "Hata Mesajı");
Trace.WriteLineIf(ibo.TraceWarning == true, "Uyarı Mesajı");
Trace.WriteLineIf(ibo.TraceInfo == true, "Bilgi Mesajı");
Trace.WriteLineIf(ibo.TraceVerbose == true, "Tüm Mesajlar");

Kendi traceListenerimizi oluşturmak istersek :
Oluşturacağımız class TraceListener den inherit almalı ve Write WriteLine metodlarını override etmeliyiz.
hemen bir örnek verelim.Kendi listener classımızı oluşturalım ve sonra web.config de şu ayarları yapalım.

image image
yine bu kodu kullanarak Listenere giden bilgileri sqlServer da kaydedebiliriz.


TraceSwitch ibo = new TraceSwitch("BenimSwith", "Açıklama");             Trace.WriteLineIf(ibo.TraceError == true, "Hata Mesajı");
Trace.WriteLineIf(ibo.TraceWarning == true, "Uyarı Mesajı");
Trace.WriteLineIf(ibo.TraceInfo == true, "Bilgi Mesajı");
Trace.WriteLineIf(ibo.TraceVerbose == true, "Tüm Mesajlar");

.Net Akımlar (streams)

.Net platformunda I/O işlemleri akımlar üzerine kurulmuştur.
Akım: byte düzeyinde bir girdi veya çıktı bilgisi oluşturulmasıdır.Farklı işlemler için farklı akımlar mevcuttur. Örneğin: network gibi aygıtlardan bilgi okuma, ekrana yazma,fiziksel diske yazma.
.NET Framework da 3 standart akım bulunur.

  • Console.Out : standart çıkış akımı
  • Console.In   :Standart giriş akımı
  • Console.Error : Standart Hata akımı

Dikkat:  Konsol uygulamalarında kullandığımız WriteLine(),ReadLine() gibi metodlar Consele.Out,In metodlarına aracılık ederler.

.NET Framework’te hem byte hem de karakter akımı sınıflar mevcuttur.Karakter akımı sınıfları temelde byte akımı sınıfları kullanır. Akım sınıflarının temelini soyut bir sınıf olan System.IO.Stream sınıfı oluşturur.Sınıfın temel metodları :
  image

Şimdi stream sınıfından türemiş akım sınıflarına bakalım. Akımlar program yazarken çok kullanacağımız sınıflardandır.

  • BufferedStream : Tampon Bölgeden okuma yazma işlemi yapan Akım sınıfıdır.Performansı yüksek sınıflardandır. Veriler Byte olarak okunur veya yazılır.
  • FileStream : Dosya ya yazma okuma işlemlerinde kullanılır.
    veriler byte olarak okunur yazılır.
  • MemoryStream : Direk belleği veri depolamak için kullanan akım.Byte veri okur yazar.
  • NetworkStream :  Bir soket üzerinden veri alış verişinde bulunurken kullanacağımız akımdır.

Yukarıdaki sınıflar byte akımı için kullanılan sınıflardır. Peki .net frameworkde karakter akımı için streamler varmıdır?
Karakter akmı için aşağıdaki streamler kullanılır:

  • StreamReader : Byte türündeki akımdan karakterleri okur.
  • StreamWriter : Byte türündeki akıma karakteri yazar.
  • StringReader : String türündeki bir nesneden karakterleri okur.
  • StringWriter : String türündeki bir nesneye karakteri yazar.

Bu sınıfların Temelini iseTextWriter, TextReader oluşturur.
.Net Framework un diğer akım sınıfları ise ;

  • BinaryReader,BinaryWriter : İkili(binary ) tipte verilerin okunup yazılmasını sağlayan streamlerdir.


Şimdi bir kaç örnek yapalım.

TextWriter dosya = new StreamWriter(@"C:\ibrahim.txt");//stream oluşturuyoruz.
dosya.WriteLine(DateTime.Now.ToString());// şuanki tarihi ibrahim.txt ye yazıyoruz
dosya.Close(); // stream i kapatıyoruz.
//Stream oluşturuyoruz okumak için.
TextReader dosya1 = new StreamReader(@"C:\ibrahim.txt");
  MessageBox.Show(dosya1.ReadLine());

// dosya1.ReadToEnd() metodu ile dosyayı sonuna kadar okuyabilirdik.


FileStream Dosya = new FileStream(@"C:\ibrahim.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);// doyamzı açmak yada yaratmak için hazırlıyoruz.
//Erişim izni olarak okuma ve yazma veriyoruz.
//Doyamızı okuma modunda paylaştırıyoruz. aynı anda başka streamde aokuyabilir.
           byte [] dizi = Encoding.ASCII.GetBytes("İbrahim");
           Dosya.Write(dizi,0,dizi.Length);
           Dosya.Close();

//ibrahim yazızını byta çeviriyoruz. Ve dosyaya yazıyoruz.Stream i kapatıyoruz.


FileStream i bu şekilde de kullanabiliriz

FileStream fs = new FileStream(@"c:\ibrahim.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);


//yazmak için.
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.Write(" İbrahim Özbey: ");
m_streamWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
m_streamWriter.WriteLine(" İlk Satır\n");
m_streamWriter.WriteLine(" Sıradaki satır. \n ");
m_streamWriter.Flush();

//okumak için
StreamReader m_streamReader = new StreamReader(fs); 
string str = m_streamReader.ReadLine();

Şimdi birde Memorystream Kullanımına bakalım.

MemoryStream memYaz = new MemoryStream();//stream tanımlıyoruz
          byte[] dizi = new byte[10];
          byte[] oku = new byte[dizi.Length];//byte dizilerimiz okumak ve yazmak için
          try
          {
              memYaz.Write(dizi, 0, dizi.Length);//memorystream e yazıyoruz.
          }
          catch (Exception hata)
          {
              MessageBox.Show("hata oluştu = "+hata);//yazamazsak hata alıcaz.
          }
          finally
          {
              memYaz.Read(oku,0,oku.Length);//memorystream den okuyoruz
              for (int i = 0; i < oku.Length; i++)
              {
                  ss += Convert.ToString(oku[i]);
              }
              MessageBox.Show(ss);
              memYaz.Close();//stream i kapatıyoruz.
          }

İpucu:byte string dönüşüm


byte [] dizi = Encoding.ASCII.GetBytes(“İbrahim”);
string Veri = Encoding.ASCII.GetString(dizi);
Stringi byte a çevirdik ve Byte ı ise tekrar stringe çevirdik.

APPDOMAİN Sınıfı


AppDomain Sınıfı nedir? Ne işe yarar?
İşletim sistemi üzerinde çalışan herhangi bir programda bir sorun olduğunda bu nun diğer programları etkilemesi için bu programlar arasında bir izolasyon sağlanmalıdır.
AppDomain sınıfı da bu işe yarayan sınıftır. Bu sınıf ile uygulamamız içinde başka bir domain açabilir onun üzerinde işlemler yapabiliriz.Çalışma zamanında uygulamamıza dll yükler kaldırırız.
Dikkat : AppDomain sınıfı çalışma zamanında Load metodu ile uygulamamıza dll yüklememize olanaktanır. yada Bu işi assembly sınıfının LoadFile metodu ile yaparız.Domain Kaldırıldığında yüklenen dll bellekten silinir.AppDomain sınıfına erişim için Using System; Kullanmak yeterli.

Şimdi Yeni bir AppDomain yarartalım.Bunun İçin Appdomain Sınıfının CreateDomain Özelliğini kullanırız. 

image

 image Görüldüğü gibi ÇAlıştığımız domain içinde yeni domainimizi açmış olduk.
AppDomain silme:  Şimdi uygulamamızın tam tersini yapalım ve Domainimizi Silelim.
bunun İçin AppDomain Sınıfının UnloadMetodunu kullanacağız.Aşağıdaki hataya baktığımızda yüklenmemiş bir domaine erişmeye çalıştığımızı söylüyor. Demekki Domainimizi başarı ile kaldırdık.
AppDomain AnaDomain = AppDomain.CreateDomain("İbrahim"); bu satırda domainimizi oluşturuyor.
AppDomain.Unload(AnaDomain); Bu satırda Domainimizi siliyoruz.image

image