Şu sıralar Visual Studio 2008 ile birlikte gelecek olan, debug işlemleri sırasında framework'ün kodlarını da debug edebileceğimiz haberi herkesi heycanlandırıyor. E güzel gelişme tabiki.

Peki bu yenilik gelmeden önce napıyorduk ? Ya da debug işlemlerine açılması planlanan DLL'ler dışında bir Dll'i debug etmek istersen ne yapabiliriz? Diğer bir amaç ise projemizde kullandığımız 3. parti Dll'leri - kodları bizde olmayan- debug etmemiz olabilir.

Bildiğiniz üzere nerdeye dünyanın ençok kullanılan decompiler aracı olan Reflector AddIn altyapısı sayesinde birçok geliştirici eklemeler yapabiliyor bu uygulamaya. Bunların arasında en güzellerinden bir tanesi de Deblector. Kısa deblector sayesinde reflector'ü kullanarak bir uygulamayı debug edebiliyoruz.

İlgili linklerden Reflector ve Deblector uygulamarını indirdikten sonra reflector uygulamasının View->Add Ins.. menüsünden ilgili plugin'i eklememiz gerekiyor.

Şimdi küçük bir uygulamayı debug etmeye çalışalım. Örnek olması açısında aşağıdaki basit kod üzerinden açıklamay yapmaya çalışacağım

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("data source=.;database=Northwind;user id=sa;pwd=1");
            SqlCommand cmd = new SqlCommand("select * from Categories",con);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            MessageBox.Show(dt.Rows[0][1].ToString());

        }

Amacımız Debug işlemi sırasında SqlDataAdapter nesnesinin varsayılan yapıcı metodunu (Default Constructor) incelemek (Bunu Visual Studio kullanarak yapabilmemiz imkansız). Reflector uygulaması açıp Tools menüsünden Deblector'ü aktif hale getirdiğimizde sağ tarafda yeni bir bölüm, toolbar da debug işleminde kullanacağımız butonları görebiliriz.

Şimdi File->Open menüsünden debug etmek istediğimiz uygulamayı seçip işlemlerimize başlayabiliriz.

Sol tarafdaki Tree'den reflector_text.exe yi seçip F7 ile uygulamayı - ya da toolbardan ilgili butona tıklayarak - debug işlemini başlattımızda (aynı zamanda reflector_test.exe nin çalıştırıldığına da dikkat edelim)yukardaki gibi bir ekran ile karşılaşıyoruz. Sarı ile işaretlenmiş IL kısmı o anda hangi satırı debug ettiğimizi göstermekte, istenirse yukardaki kısımdan ilgili kod bloğunun C#  karşılığını da görebilmekteyiz. Alltaki siyah - Shell - kısımda ise o anda hangi satırın debug edildiğini görebilmekteyiz. Visual Studio'dan alışık olduğumuz  F10 ile satır satır ilerleyebilir, F11 ile de o anda debug edilen metodun içerisine girerek işlemlerimize devam edebiliriz.

Sol Tree'den button1_click metodunu seçip breakpoint - toolbardaki kırmızı ikon - koyarak debug işlemini başlatalım.

Çalışan uygulamamızda button1 e tıkladığımızda breakpoint koyduğumuz yerde bizden komut beklemeye hazır durumda olduğunu göreceksiniz.Artık F10 ya da F11 ile kodları debug etmeye başlayabiliriz.

 


 
Categories: .NET | Inceleme

Uygulamamızda debug yaparken nesnelerimizi daha anlaşılır şekilde görmek için çeşitli Visualizerları kullanırız. Örneğin bir DataTable ya da DataSet'in içeriğini debug işlemi sırasında Visualizer yardımı ile çok daha anlaşılır bir şekilde inceleyip, doğru datalarla çalışıp çalışmadığımıza karar verebiliriz. Yeri geldiğinde XML dosyalarımızın içeriğini de daha anlaşılır şekilde görüntülemek için XML Visualizer'den faydalanırız.

Visual Studio 2005, belirli tipler için visualizerlardan yararlanabilmemizi sağlıyor. Ama bu harika IDE istenildiğinde kendi nesnelerimizi de debug işlemi sırasında özel geliştirdiğimiz bir visualizer ile gösterebilme imkanı da sağlıyor. Senaryomuz şöyle;

Uygulamamız içinde Person isimli bir türümüz var. Debug işlemi sırasında kendi geliştirdiğim Visualizer ile (aşağıdaki resimde görüldüğü üzere) bu nesneyi görüntülemek istiyorum.

Bunun için yapmamız gereken projemize yeni bir Debugger Visualizer Item'ı eklemek olacaktır. Örnek projemiz ,geliştirğimiz Visualizer'i test edecek bir Windows uygulaması (PersonVisualizerTest), Person ve türeyen nesnelerimizi barındıran bir dll (EntityObjects), ve daha sonra da kullanmak amaçlı geliştireceğimiz içerisinde kendi visualizer'imizin bulunduğu bir başka dll (PersonVisualizerLib) projesinden oluşacak.

Person nesnemiz aşağıdaki gibidir. Dikkat edecek olursanız Serializable Attribute'ü uygulanmıştır nesnemize.Yani nesnemizin geliştirdiğimiz visualizer tarafından görüntülenebilmesi için nesne serileştirilebilir olmalı.

   [Serializable()]
    public class Person
    {
        Bitmap _picture;
        public Bitmap Picture
        {
            get { return _picture; }
            set { _picture = value; }
        }

        private int _no;
        public int No
        {
            get { return _no; }
            set { _no = value; }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

    }
 

Gelelim visualizer'imizin geliştirilmesine. DLL Projemize (PersonVisualizerLib) sağtıklayıp Add->New Item... menüsünden "Debugger Visualizer"'i şeçip tamam diyoruz.Personel nesnemizin içinde olduğu dll i projemize ekledikten sonra Visualizer'imizin kodunu aşağıdaki gibi tasarlıyoruz.

[assembly: DebuggerVisualizer(typeof(PersonVisualizerLib.PersonVisualizer),
Target = typeof(EntityObjects.Person),
 Description = "Personel Debug Ekaranı ile Göster")]

namespace PersonVisualizerLib
{
  
    public class PersonVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
           
            Person person = (Person)objectProvider.GetObject();
            using (PersonForm displayForm = new PersonForm())
            {
                displayForm.person = person;
                windowService.ShowDialog(displayForm);
            }
        }
    }
}

assembly attribute'ü ile visualizer'in tip bilgisi, hangi türden nesnelerin visualizer'da görüntüleneceği, ve debug esnasında visualizer'imizin görüntülenecek adını belirtiyoruz. Show metodunun içerisinde de debug esnasında görütülenmesini istediğimiz nesneyi alıp person türüne dönüştürdükten sonra Form'a bu nesneyi görüntülemesi için veriyorum

PersonForm, nesnemin görsel olarak gösteriminde kullanacağım form nesnem. Form'un üzerinde, person nesnesini gösterecek  PropertyGrid , person nesnesinin resmini gösterecek Picturebox , person nesnesinin Name ve No  özelliklerini gösterecek iki adet Label controlü içermekte.Form'un kodu da aşağıdaki gibidir.

        public Person person;
        public PersonForm()
        {
            InitializeComponent();
        }

        private void PersonForm_Load(object sender, EventArgs e)
        {
            label1.Text = person.Name;
            label2.Text = person.No.ToString();
            pictureBox1.Image = person.Picture;

            propertyGrid1.SelectedObject = person;
        }

Tüm bu hazırlıklardan sonra visualizer'i test edeceğim projeme Person nesnesinin içinde olduğu Dll'i ekliyorum. Visualizer'imizin VS.NET 2005 tarafından işlem görebilmesi için oluşan PersonVisualizerLib.dll 'ini C:\Documents and Settings\{user_name}\My Documents\Visual Studio 2005\Visualizers dizinine kopyalıyoruz. Artık kendi geliştirdiğimiz tüm uygulamalarda bu visualizer'i kullanabiliriz. Ama makina düzeyinde tüm kullanıcıların'da bu visualizer'den yararlanmasını istiyorsak ilgili dll'i C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\Visualizers dizinine kopyalamanız yeterli olacaktır.

Artık debug esnasında oluşturğumuz visualizer ile Person nesnemizi tasarladığımız şekilde görebilmek mümkün olacaktır.

Tabiki bu örnek dışında, örneğin geliştirdiğiniz bir asp.net uygulamasında ürün sepeti'nizi bir grid içinde görüntülemekten tutun, bir stream nesnesini istediğiniz formatta görüntülemeye kadar birçok özel visualizer geliştirerek debug işlemlerini hem kolaylaştırıp hem de daha zevkli hale getirmek mümkün :=)

PersonVisualizerTest.rar (43,77 KB) (Bahsi geçen örnek uygulama ektedir.)
 
Categories: .NET | C# | Inceleme

October 5, 2007
@ 11:38 PM

Nerden aklımda kalmış bilmiyorum ama Tv'de yayınlanacağı zaman tanıtımlarını ilgi ile izlemiştim. Malesef yayınlandığında ise ( tekrarlarının olduğunu hatırlıyorum ) izleme fırsatı bulamamıştım. Asansörde iken bir konuşmaya kulak misafiri olduğumda "hay Allah! kan uykusu...ilk fırsatta izlemeliyim" fikri uyandırmıştı. Şirketteydim ve ilk işim  youtube'da aratmak oldu ( google video dan da terk parça halinde izleyebilirsiniz). Ve tüm bölümler 10'ar dk'lık bölümler halindeydi. İzlemeye başladım. Bir belgeselin  insanı bu kadar etkileyeceğini açıkcası ummuyordum ve günümün bu kadar kötü geçeceğini de.

Mutlaka izlenmesi gerektiğini düşündüğüm ( "eh yani günaydın" der gibi olanlar mazur görsün ) bu belgesel yeri gelince gözlerin dolmasına bile neden oluyor. Özellikle son 10 dakikalık bölümde ( Iran'daki bölücü örgüte baskın düzenlenmek istenir, Demirel buna izin vermez, o bölücü örgüt üyeleri karakollarımızdan birisine saldırı düzenler ve onlarca şehit veririz) resmen beynimden  vuruldum. Ve hemen arkasında bu olayların içinde olan bir albayın şu sözleri ise gerçekten düşündürücü

... ölü bir teröristin Türkiye Cumhuriyetine maliyeti 10 tirilyon liradır. Eğer ki biz son 20 yılda 30 bin teröristi bertaraf etmiş isek, Türkiye'nin bundan kaybı 300 katrilyon Türk Lirasıdır. O zaman soru şu; bu 300 katrilyon kime gidiyor ? Terörden doğan rantın nereye gittiğini bilirseniz o zaman terör ile mücadele edilmeyişinin sebeblerini ortaya koyabilirsiniz. Onun içinde şahsi menfaatiniz de olabilir...

Yakın tarihimizde yaşanan (93 - 95 yıllarında PKK'ya karşı düzenlenen operasyonlar) bu önemli olayların baş kahramanları yaşadıklarını şimdiye kadar izlemediğim birçok görüntü eşliğinde anlatıyor. Tekrar tekrar izlenmesi gereken bir baş yapıt olan kan uykusu, bizler bu yazıları okurken, işlerimizi yaparken, akşam eve gittiğimizde huzurlu  bir şekilde ailemizle yemek yerken birilerinin başka dünyalarda yaşadığını, başka dünyalarda mücadele ettiğini ve günlük yaşamda asla aklımızın ucuna getirmediğimiz, hatırlamadığımız bu insalara gönülden vefa borcumuzun olduğunu hatırlatıyor.

Söylesem tesiri yok,
Sussam,
Gönül razı değil.

               Fuzuli


 
Categories: Yasam

Msdn'de soldaki TreeView'de StackTrace sınıfını incelemek isterken hemen altında bulunan StopWatch sınıfı isminden dolayı baya bir gözüme battı. Neymiş diye incelerken çoğumuzun bir kodun ne kadar süre çalıştığını test etmek için DateTime.Now ile o anki zaman değerini alıp kod bitiminde Datetime.Now ile zaman değerinden bir önceki değeri çıkarma işlemini yaparız. StopWatch sınıfı ile çok daha hassas ve kesin ( Daha alt sistem API'lerini kullandığınu söyledi google ;) ) değer alabiliyormuşuz. Kullanımına dair örnek kod aşağıda.

private void button1_Click(object sender, EventArgs e)
{
   System.Diagnostics.Stopwatch diff = new System.Diagnostics.Stopwatch();
   diff.Start();
   for (int i = 0; i < 2000000; i++)
   {
      int x = i >> 2 << 22 >> 222 << 2222 >> 22222 << 222222;
   }
   diff.Stop();
   label1.Text = diff.Elapsed.ToString();
}       

DateTime ile aynı kodu şu şekilde test ettim.

long t = DateTime.Now.Ticks;
for (int i = 0; i < 2000000; i++)
{
   int x = i >> 2 << 22 >> 222 << 2222 >> 22222 << 222222;
}
long t1 = DateTime.Now.Ticks;
label1.Text = (t1 -t).ToString();

Sonuç ya 0 (yazı ile sıfır) ya da 156250 iken aynı kodu StopWatch sınıfını kullanarak test ettiğimde 28400 ile 28800 arasında sonuçlar verdi.
 
Categories: C# | Code | Inceleme

Kimi projelerde sürekli aynı pencere yapılarına sahip ekranlar ile karşılaşırız. Ya da kendi oluşturduğumuz bir ürünümüz vardır Visual Studio 2005 için, kullanıcı File->New Project dediğinde bizim ürünümüze ait standart bir projenin seçilip (ilgili dll'ler ve resource dosyaları eklenmiş) hızlı bir şekilde projeyi oluşturması imkanını kullanıcıya vermek isteyebilirz.

Örneğin ASP.NET Ajax Extention'u kurduğumuzda artık File->New WebSite dediğimizde açılan dialog penceresinde "Ajax Enabled Website" isimli bir proje şablonu karşımıza çıkar ve seçip projeyi oluşturduğumuzda artık tek yapmamız gereken kodumuzu yazmaktır. İlgili Dll'ler, tüm ayarları yapılmış web.config dosyası hazır haldedir.

Benze bir uygulamayı geliştirmek VS.NET 2005 de oldukça kolaydır. Örneğimizde ben "MyModule" isimli örnek bir windows projesi hazırladım.Menüleri, ToolStrip'i, DataGridView ve StatusStrip'den oluşan standart basit bir windows formu. Örnek olması açısından da StatusStrip deki linke tıkladığımızda ilgili linke yönleniyor (amaç hazır kodların bulunması.) Diğer bir detay da projemizde kendi oluşturduğumuz bir dll'inde ekli olması.

Amacımız artık File->New Project işlemi yapıldığında Project Template ekranında hazırlamış olduğumuz örnek projenin bir şablonunun çıkması vr Kullanıcı bu şablonu seçip projeyi oluşturduğunda bizim hazırladığımız projenin aynısının oluşturulmasının sağlanması. Bunun için yapmamız gereken File menüsünden Export Template... menüsüne tıklamak.

İlk olarak "Project Template" seçeneğini işaretleyip Next ile devam ediyoruz.

Template icon kısmından project Templates ekranında görünmesini istediğimiz resmi, eğer beğenmediyse Template name kısmından ismi değiştirebilir, Template description kısmında ise templatimizi kullanacak kişiye gerekli açıklama bilgisini verebilirsiniz.  "Automatically import ..." seçeneğinin aktif olması gerekli dizinlere oluşturulacak proje şablonunuzun ( kendisi bir zip dosyası olmaktadır ) otomatik olarak kaydedilmesini, "Display an explorer ..." seçeneğinin aktif olması da işlem bittikden sonra ilgili klasörün açılmasını sağlayacaktır. Finish diyerek işlemimizi bitiriyoruz. Bu işlemleden sonra C:\Documents and Settings\{kullanıcı}\My Documents\Visual Studio 2005\My Exported Templates dizinine ve C:\Documents and Settings\{kullanıcı}\My Documents\Visual Studio 2005\Templates\ProjectTemplates dizinlerine MyModule.zip isimli dosyayı kopyalayacaktır.

Artık Vs.NET'te Project Templates Dialog penceresinde "My Templates" kısmında MyModule isimli bir proje şablonun oluştuğunu göreceksiniz.

 Seçip projeyi oluşturduğumuzda ise hazırlamış olduğumuz şablonun birebir aynısını karşımızda göreceğiz.

 

MyModule.rar (36,44 KB) (Anlatımda kullanılan örnek proje ektedir.)
 
Categories: .NET | Inceleme