October 28, 2008
@ 10:03 AM
MVP Global Summit 2008'de lanse edilen ve önemli özelliklerinden bahsedilen Dev10 yani vs.net 2010'un  CTP haberini sonunda gördük :)

Evet evet, şaka gibi ama değil, şunun şurasında 2010'a ne kadı ki :) değil mi ?

Aşağıdaki adresten indirebilir

http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&DisplayLang=en

şurdaki adresten de

http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx

detaylı bilgi edinebilirsiniz.


 
Categories: .NET

Microsoft klasiği olan bir klasik olan Service Pack haberi ile yine karşınızdayız :)

Özellikle WPF ile ilgili çalışmalar yapanların şiddetle kurmalarını tavsiye ediyorum.Şurdaki linkden bu service pack ile neleri tamir ettikleri hakkında detaylı bilgi mevcut.

Burdan Vs.NET 2008 ( 831.3 MB lik iso dosyasi da şurda) ve burdan da .NET Framework 3.5 için gerekli Service Pack leri indirebilirsiniz.

Overview kısmına gözatmanızda fayda var derim. Kurulumdan önce de readme dokümanını okuyunuz. Örneğin vista kullanıcıları için

Visual Studio 2008 SP1 installation fails when the Windows Vista sidebar is on.

To resolve this issue:

1. Right-click the Sidebar icon in the notification area, at the far right of the taskbar.
2. Click "Exit".

açıklaması ile beni benden almıştır :)))))

 


 
Categories: .NET

July 30, 2008
@ 09:17 AM

Sevgili Sefer Algan ve Burak Selim Şenyurt ile kısa bir süre önce beğeni ile takip edilen  .NET Radyo'nun 3. ve 4. bölümlerini c#nedir?com da yayınlandı.

3. bölümde ORM ve LINQ konusunda merak edilen ve  sıkça hakkında soru aldığımız Object Relational Mapping kavramı ve LINQ to SQL yaklaşımı üzerinde duruldu. ORM araçlarının amaçları, kullanım alanları , avantaj ve dezavantajları üzerinde durduk.

4.bölümde ise Yeni .Net Kavramları konulu söyleşiyi gerçekleştirdik. .Net Framework 3.0, 3.5, Asp.Net 3.5, Futures, Volta, WCF, WPF, Silverlight, Astoria gibi pek çok kavram üzerinde kısaca durmaya çalıştık. Amaç Microsoft ürünleri ile uygulama geliştiren uzman ya da yeni başlayan geliştiricileri kavram kargaşısından bir nebze de olsa kurtarmayı amaçladık.

Çok kısa bir süre sonra diğer .NET Radyo'ların hazırlanmasına başlayacağımızı belirteyim.


 
Categories: .NET | Inceleme | Yasam

Kaynak kodları sizde olmayan bir dll'inizin olduğunu düşünün (.net frameworkdeki tüm dll lerin kaynak kodu yok ki zaten bizde) içinde onlarca tip ve bu tiplere ait metodlar, özellikler vs vs. Peki siz " yahu şu xxx tipinin yyy metodu private değil de public olsaydı oh ne güzel tak tak çağırır kullanırdım" diye aklınızdan geçirdiğinizde ilk yapılacak iş Reflection ile private metodu çağırmak olurdu ki, hem kullanması biraz karşık - parametrelerin uyum kontrolu, tip kontrolü, koddaki kirlilik de cabası - hem de performans sorunundan dolayı tam düşüncelerimizdeki o "sadeliği :) " gerçekleyemiyor :))  o zaman yapılacak iş dll'i açık private metodu public yapıp sonra aynı dll'i bozmadan tekrar kaydetmek... Bu işi yapan çok güzel bir aracı sizlere tanıtmak istiyorum...

Şurdaki adresten edinebileceğimiz aracı kurdukdan sonra test amaçlı bir dll projesi oluşturup public ve private üye elemanlar içeren bir tip ekleyip dll'i oluşturalım.

using System;
using System.Collections.Generic;
using System.Text;

namespace DllEditTest
{
    public class DummyObject
    {
        public string GetXml()
        {
            return "<xml>";
        }

        private void Cagiramazsinki()
        {

        }
    }

    class SecretObject
    {
        private int _price;
        public int Price
        {
            get { return _price; }
            set { _price = value; }
        }
    }
}

Örnek Dll'i test edecek bir uygulama oluşturup, kullandığımızda SecretObject isimli tipe beklediğimiz gibi erişmediğimizi görürüz.

Yine beklediğimiz gibi DummyObject sınfından bir nesne oluşturduğumuzda  Cagiramazsinki isimli private metodun görünmediğini görürüz.

 

Şimdi CFF Explorer uygulamasını başlatıp ilgili dll'i bu uygulama ile düzenlemek için ( File -> Open ) açalım. Aşağıdaki resimdeki gibi dll'in içerisindeki erişilebilen tipin metod bilgilerine erişelim.Dikkat ederseniz sadece erişilebilen public metodlarının listelendiğini göreceksiniz. Listeden Cagiramazsinki isimli private metodu seçtip sağ kısımda Flags satırının en sonunda "Click Here" yazan yere tıkladığınızda metodun özellikleri çıkacaktır. Bu kısımda "public" seçeneğini seçip dialog penceresini kapatıp, dll'imizi kaydediyoruz.

Tekrar dll'i test ettiğimz örnek uygulamamıza dll i eklediğimizde artık bu metodun da çağrılabildiğini göreceğiz.

 

Yine benzer şekilde TypeDef node'undan SecretObject'i seçip Flags kısmından sınıfımızı public olarak işaretleyip dll imizi kaydettikden sonra bu sınıfa da test projemizden erişilebildiğini görürüz.

Böylelikle bir dll in tüm özelliklerini değiştirirek kendimize özel hale getirip kullanabiliriz. Tabi ki iyi niyetle, tüm bu çabaların daha iyi uygulama geliştirme amaçlı olduğunu aklımızdan çıkarmadan değil mi ? :))))) Daha fazla bilgi için bu yararlı aracın sayfasından yararlanabilirsiniz.

Bir sonraki yazımda da yine iyi niyetli düşüncelerimizi gerçekleştirmek için neler yapabileceğimizi inceleyeceğiz.


 
Categories: .NET | Inceleme

Kod yazarken mouse kullanmayı sevmyenler için klavye kısa yolları önem kazanmaktadır( ayrıca kod yazmakda hız kazandırdığı da gayet açıktır) Hoşuma giden bir o kadar da az bilinen bazı kısayolları sizlerle paylaşmak istedim.

1- Kod yazarken birçok kez kopyalama işlemi yapıyoruz. Daha önce kopyalanan kodu,  2. kopyalama (ctrl + c) işleminden sonra kaybetmiyormuşuz :) yani vs arkaplanda kopyalanan kodları tutuyormuş. Ctrl + Shift + V ile bu kopyalanan kodlar arasında gezebiliyoruz.

Daha önceden kopyalanmış bir kodu yapıştırmak istediğimizde ctrl + shift +v tuş kombinasyonuna birden çok kez bastığımızda daha önceden kopyalanmış kodları da görebiliyoruz

2- Namespace'ini bilmediğimiz ya da o anda hatıryalamadığımız bir Type'in ismini doğru şekilde yazdığımızda type'in isminin hemen altında küçük kırmızı bir simge çıkararak, vs.net bize iki öneride bulunmaktadır. İster o anda direk namespace ismi ile kullanmayı, istenirse de using ifadesi ile kodun başına namespace'i eklemeyi önermekedir. Bu menüyü klavyeden elinizi kaldırmadan görebilmek için Ctrl + . tuş kombinasyonunu kullanabilirsiniz. (Teşekkürler Mustafa Güven :) )

 

3- Uzun metodlarda ya da sınıf tanımlamarında açılan ve kapanan küme parantezleri (braces) arasında dolaşmak için Ctrl + ] tuş kombinasyonunu kullanabilirsiniz.


 
Categories: .NET | Inceleme

Oluşturduğumuz assemblyleri Global Assembly Cache'e (GAC) yüklemek için gerek gacutil konsol uygulamasını gerekse de Control Panel\Administrative Tools altındaki Microsoft .NET Framework 2.0 Configuration aracını kullanarak manuel yükleme işlemini gerçekleştirebiliyoruz.

Peki bu işlemi yardımcı araçlar ile manuel olarak değil de bazı ihtiyaçlardan dolayı :) programatik olarak gerçekleştirmek isteyebilirsiniz. Reflector ile biraz .NET'i kurcaladığımda - eh! .net framework kendi içinde böyle bir desteği mutlaka sağlıyordur mantığından yola çıkarak - aşağıdaki resimden de görebileceğiniz GacUtil isimli bir sınıf ile karşılaştım.



Aşağıdaki basit bir reflection işlemi ile kendi assembly'imizi GAC'a yükleyebiliriz.

   1:  namespace BTAkademi.TestCodes
   2:  {
   3:      class Program
   4:      {
   5:          static void Main(string[] args)
   6:          {
   7:              //GAC'dan System.Web dll'i yükleniyor
   8:              Assembly asm = Assembly.Load(@"System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
   9:   
  10:              // Type bilgisi alınıyor
  11:              Type t = asm.GetType("System.Web.Configuration.GacUtil");
  12:              // Metodu invoke edebilmek için GacUtil türünden nesne oluşturuluyor
  13:              object o = Activator.CreateInstance(t);
  14:   
  15:              //Metod bilgisi alınıyor
  16:              MethodInfo mi = o.GetType().GetMethod("GacInstall");
  17:   
  18:              //metod çağrılıyor
  19:              mi.Invoke(o, new object[] { "C:\\gacTest.dll" });
  20:   
  21:          }
  22:      }
  23:  }


Not : GAC'a yüklenmek istenen assembly'nin public key token'a sahip olması gerekmektedir.

 

13/7/2008 tarihli düzenleme :

try
{
    System.EnterpriseServices.Internal.Publish gac = new System.EnterpriseServices.Internal.Publish();
    gac.GacInstall(yuklenecekassemblyadi);
}
catch (System.Security.SecurityException se)
{

}

şeklinde de yüklenebiliniyormuş :))) Eh azmetmek gibisi yok.


 
Categories: .NET | C# | Code | Inceleme

.net dünyasına ilk adım atanlardan sıkça duyduğum soruların başında "bu namespace'leri nerden bileceğim, bu class'ın var olduğunu nerden bileceğim, ya da hangi namespace içerisinde olduğunu nerden bileceğim" şeklinde sorular geliyor. Ben de "zamanla ve kullandıkça, ihtiyacınız oldukça" diye cevaplıyorum.

Şu ve şurdaki linklere dikkat edersek aslında .net framework'ün ne kadar geniş bir dünya olduğunu, hatta biraz abartırsak da "dibsiz bir kuyu" olduğunu da söyleyebilirim ;)

Gün geçmiyor ki yeni assembly'ler, yeni namespaceler ve type'larla karşılaşmayalım sayın programcılar :)


 
Categories: .NET | C# | Inceleme

16 Şubatta Çankaya üniversitesinde daha önce iki kez Istanbulda düzenlemiş olduğumuz etkinliğimizi gerçekleştirdik. Tüm katılımcılara faydalı olduğumuzu umarım. Etkinliğin düzenlenmesinde başta İlker Acar olmak üzere, diğer MSP arkadaşlara teşekkür ederiz.

Not : Berk sana ayrıca teşekkür ederim ;) o güzel kahvaltı mekanı ile bizleri buluşturduğun için :)




 
Categories: .NET | Yasam

January 30, 2008
@ 11:21 PM
Linq to Sql de veritabanı sunucusuna giden sorguları SQL Profiler ile izleriz. Fakat daha kolay bir yol var. Aşağıdaki resim gayet açıklayıcı ;)
Tek yapmamız gereken DataContext türünden nesnemizin Log özelliğine istediğimiz çıktıyı vermek olacaktır.



Eğer kodumuzu aşağıdaki gibi düzenlersek bu defa da üretilen T-SQL istediğimiz herhangi bir fiziksel dosyaya kaydedilecektir.

testDataContext db = new 
db.Log = new StreamWriter("C:\\l2s.log"); var v = from p in db.Persons where p.Surname == "asma" select p.Name; Text = v.First(); db.Log.Close();
l2s.log dosyasının içeriği aşağıdaki gibidir.

SELECT TOP (1) [t0].[Name]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[Surname] = @p0
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [asma]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

 
Categories: .NET | C# | Code | Inceleme

C#nedir?com ekibi olarak çok güzel bir etkinliğin dah altına imzamızı atmış olduk.

Tüm arkadaşlarıma ve katılımcılara teşkkür ediyorum.

16 Şubatta Ankara'da görüşmek üzere.


  
 
Diğer tüm resimler için buyrun.

 
Categories: .NET | Internet

Ekim ayında şu adresten .net kaynak kodlarının bir kısmının ilerde geliştiriciler için açılacağını duymuştuk. Geçen zaman sonunda ScottGu şu linteki güzel haberi bizlerle paylaştı. Kendisi bile mutlu olmuş bu haberi duyurmaktan ;)

Sadece VS.NET 2008 için geçerli olan bu işlem, debug yaparken aşağıdaki .net kütüphanelerinin kodlarını göreceğiz. Ençok da System.Threading,  System.Reflection, System.Windows.Forms kısımlarını merak ediyorum!

  • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)

En kısa zamanda C#nedir?com da konu ile ilgili bir video hazırlamaya çalışacağım.


 
Categories: .NET | Inceleme

January 15, 2008
@ 08:47 PM

Değerli Arkadaşlar, biliyorsunuz bu ay sonunda Visual Studio.NET 2008 ve SQL Server 2008 in lansmanı yapılacak. SQL Server 2008 ile güzel bir yeniliği sizlerle paylaşmak istiyoruz. Veri tabanında BLOB (Binary Large Object) nesnelerini özellikle veritabanında dosya tutmak istediğimizde kullanıyoruz.  Özellikle iş akışı ve döküman yönetimi sistemlerinde veritabanında dosya tutmaya başladığımızda veritabanı gün geçtikçe dosya sistemi gibi büyümeye başlıyor, ve yedekleme işlemi işkenceye dönmeye başlıyordur. SQL Server 2008 dosya sistemi ve ilişkisel veritabanı sistemini kullanarak hibrid bir model sunuyor bizlere. Yani 2008 den itibaren artık BLOB işlemleri veritabanında bir kolon şeklinde tanımalanabilecek ancak istersek dosya içeriğini file system'de tutabileceğiz. Böylece ilişkisel veri modelinden vazgecmeden geniş binary içerkli dosyaları fiziksel olarak diskte saklayabileceğiz.  Veritabanı ise fiziksel dosya sistemine bir nevi referans gibi çalışacak. Bu işlem tamamen opsiyonel olacağı için eski mantıklada çalışmak mümkün olabilecek.


 
Categories: .NET | Code

November 14, 2007
@ 01:22 AM

Düşündüğümden daha çok kişi çalışıyormuş. Özellikle ilk sıradaki  sağdan ikinci hanımefendinin ne iş yaptığını merak ediyorum ;)

Kaynak : http://blogs.msdn.com/charlie/archive/2007/11/12/visual-c-team-picture-fall-2007.aspx

CSharpTeam.jpg (2,19 MB) (Resmin büyük hali)
 
Categories: .NET | C#

November 6, 2007
@ 04:31 PM

Şu linkteki habere göre Visual studio 2008 ve .NET 3.5 bu ay içinde release olacakmış. Haydi hayırlısı diyelim.

Şurdaki linkten de .NET 3.5 'un namespace posterini (pdf) indirebilirsiniz. Posterin önizlemesi için şu linke bakabilirsiniz.


 
Categories: .NET

Ş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

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

Debug işlemleri yaparken sıklıkla karşılşatığımızın durumların başında nesnemiz başka bir nesneyi içeriyorsa bu nesneyi ancak hiyeraşik bir biçimde inceleme şansına sahip oluyoruz. Aşağıdaki resimde daha net birşekilde ne demek istediğim belli oluyor.

Görüldüğü gibi Report nesnemiz içerde List<int> türünden Results özelliğine (property) sahip. Bu özelliğin hangi değerlerini tuttuğunu görmek için + ile detayına inip bakmamız gerekiyor. Bu özellik baska bir nesneyi temsil ediyor, ve o nesne de içerisinde iç içe (nested ) başka değerleri tutuyor olabilir. Bu durumda + lar ile detaylara inip boğulabilirsiniz ;-) Ama çoğumuz bu iç içe nesnelerin aslında sadece işimize yarayacak kısmını debug işlemi sırasında görmek isteyebilir, hatta bu kısımları özelleştirerek istediğimiz gibi bir görüntü sağlayabiliriz. Aşağıdaki resim ile bir önceki resimi kıyaslayarak debug işlemi sırasındaki görüntüleri karşılaştırabilirsiniz.

Bu görüntünün sağlabilmesi için yapmamız gereken Report nesnemizin debug işlemi sırasında görünmesini isteyeceğimiz şekilde bir proxy class'ını hazırlamak.

[DebuggerTypeProxy(typeof(ReportDebuggerProxy))]
    public class Report
    {
        private DateTime _date;
        public DateTime ReportDate
        {
            get { return _date; }
            set { _date = value; }
        }

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

        private List<int> _results = new List<int>();
        public List<int> Results
        {
            get { return _results; }
            set { _results = value; }
        }

        private int _dummy;
        public int Dummy
        {
            get { return _dummy; }
            set { _dummy = value; }
        }

    }

Report nesnemize DebuggerTypeProxy attribute'nün uygulandığı dikkatinizi çekmiştir. Bu atrribute sayesinde Report nesensi debug işlemi sırasında sanki Report türünden bir nesne değil de ReportDebuggerProxy nesnesinin bir görüntüsüymüş gibi karşımıza çıkacaktır. Şimdi proxy görevini görecek sınıfımızı yazalım.

public class ReportDebuggerProxy
    {
        Report _report;
        public ReportDebuggerProxy(Report report)
        {
            _report = report;
        }

        public string ReportDate
        {
            get { return _report.ReportDate.ToLongDateString();}
        }
        public string Name
        {
            get { return "Raport Name : " + _report.Name; }
        }

        public string Results
        {
            get
            {
                StringBuilder sb = new StringBuilder();
                foreach (int result in _report.Results)
                {
                    sb.Append("(");
                    sb.Append(result.ToString());
                    sb.Append(") ");
                }
                return sb.ToString();
            }
        }
    }

Görüldüğü gibi debug sırasında görmek istediğimiz özellikleri belirtiyoruz. Proxy sınıfında dikkat ederseniz Report sınıfındaki Dummy özelliğine yer verilmemiş ve diğer özellikler ise görülmek istendiği şekilde özelleştirilmiş.

 


 
Categories: .NET | C# | Inceleme

Debug işlemleri yaparken yeri geldiğinde bir o kadar yararlı ve zaman kazandırıcı özellikleri  çoğunlukla gözden kaçırıyoruz. Oysa yapmamız gereken breakpoint üzerine sağ tıklamak ve özellikleri incelemek.

Condition : Eğer belirli bir duruma göre debug işlemini gerçekleştirmek istediğinizde bu özelliği aktif hale getirebilirsiniz. Aşağıdaki kod üzerinden örnek vermek gerekirse; Do metodunda dummyValue değişkenin değeri 22 ise debug işleminin aktif hale gelmesini istersem ;

gibi bir Condition eklemem yeterli olacaktır. Eğer dummyValue 22 den farklı bir değer ise debug işlemi sırasında breakpoint yokmuş gibi işlem görecektir. BreakPoint'e bir Condition eklediğinizde breakpoint'in ikonunun değiştiğini göreceksiniz. Bu kısımda da  otomatik isim tamamlama özelliğinin aktif olması harika birşey!

Hit Count : Debug işlemi sırasında o ana kadar kaç defa breakpoint'e gelindiğini takip edebiliriz.İsterseniz de "eğer bu breakpoint'e x kadar gelindiğinde artık debug işlemi yapılmasın" da diyebilirsiniz. (Açılan dialog penceresindeki combobox'dan diğer seçenekleri inceleyiniz.)

Filter : Belirli filitreler koyarak debug işlemlemini aktif hale getirebiliriz. Aşağıdaki resimde hangi filitreleri uygulayacağımız açıklanıyor zaten. Bunlar dışında bir filitre uygulamak istediğinizde buna izin verilmediğini göreceksiniz.Örneğimizdeki filitrede eğer bu metod "debugTest" isimli Thread tarafından çağrılmışsa debug işlemi aktif hale gelecektir.

When Hit... : Debug işemi aktif hale geldiğinde isterseniz Output Window'a durum bilgilerini yazdırabilir, isterseniz de VS.NET 2005'e ait çeşitli makrolardan birini çağırabilirsiniz. Örneğimizde breakpoint'in hangi metod içinde olduğunu ve bu metodu kimin çağırdığını yazdırıyoruz. Ardından da o satırı yorum satırı haline getiren bir makroyu çalışrırıyoruz.

 

Tanımlamarımızı yapıp debug modunda uygulamamızı çalıştırdığımızda aşağıdaki gibi bir sonuç alıyoruz.

public Form1()
{
    InitializeComponent();
    CheckForIllegalCrossThreadCalls =
false;
}
private void button1_Click(object sender, EventArgs e)
{
    DoOp();
}

public void DoOp()
{
   
Thread th = new Thread(Do);
    th.Name =
"debugTest";
    th.Start();
}

int dummyValue = 22;
public
void Do()
{
   
for (int i = 0; i < 5; i++)
    {
         Text = i.ToString(); //Breakpoint konulan satır
    }
}

 


 
Categories: .NET | C# | Inceleme

September 11, 2007
@ 01:10 AM

Tools->Options dan çıkan pencerede Environment->Start Up'ı şeçiyoruz,bu kısımdaki At startup seçeneklerinden show empty environment i seçerek açılışta VS.NET 2005'i yavaşlatan Start Up Page'i kaldırabiliyoruz.

Diğer tercihimiz de açılışta karşımıza çıkan splash screen'i kaldırmak. Bunun için de VS.NET 2005 için masa üstünüzde bir kısayol oluşturun.Sağ tıklayıp properties dediğimizde açılan pencereden Shortcut Tab'ını seçip, Target kısmındaki bölüme /nosplash parametresini ekleyerek biraz olsun VS.NET 2005'in açılışını hızlandırabiliriz.


 
Categories: .NET | Inceleme

September 3, 2007
@ 10:22 PM

Debug işlemleri yaparken işimize yarayacak 3 adet Attribute'ü aşağıdaki örnek üzerinden incelersek ;

DebuggerDisplay attribute'ü ilgili sınıfdan nesne örneğini incelediğimizde debug penceresinde istediğimiz şekilde görünmesini sağlayabiliriz.

DebuggerStepThrough  attribute'ü ile de F11 ile kod debug edildiğinde bu kod satırların debug işlemi sırasında dikkate alınmayacağını belirtir. Örneğin

Ogrenci o = new Ogrenci();
o.Name = "ali";
o.No = 22;

gibi bir kod satırında o.Name="ali"; satırında iken F11 'e bastığımızda Name özelliğinin set metoduna dallanacağını biliyoruz. Fakat DebuggerStepThrough attribute'ü set için uygulandığından bu dallanma gerçekleşmeyecek o.No=22 satırından itibaren debug işlemi devam ecektir. (Laf aramızda süper bir atrribute'müş kendisi yahu ;) )

DebuggerBrowsable isminden de açıkça belli olduğu üzere bu attibute'ün uygulanmış olduğu nesnenin X özelliği debug ekranında görüntülenmeyecektir.

 

[DebuggerDisplay("Ad ={Name},No = {No}")]
public class Ogrenci
{

   private string _name; 
   public string Name
   {
      [DebuggerStepThrough]
      get { return _name; }

      [DebuggerStepThrough]
      set { _name = value; }
   }

   private int _no;
   public int No
   {
      get { return _no; }
      set { _no = value; }
   }
   private int _x;
   [DebuggerBrowsable(DebuggerBrowsableState.Never)]
   public int X
   {
      get { return _x; }
      set { _x = value; }
   }
}


 
Categories: .NET | C#

September 3, 2007
@ 10:06 PM
Ctrl+F ile VS.NET 2005'de gelişmiş şekilde arama işlemleri yapabiliyoruz. Bir başka arama şekli de şöyle (Incremental Search demiş MS)

Ctrl + I tuş kombinasyonunu uyguluyoruz açık bir kod penceresinde. Ikon değiştikten sonra (dürbün ve aşağı ok şeklinde bir ikon beriliyor) sonra aramak istediğimiz kelimeyi yazıyoruz. O ana kadar yazdığımız kelime ile eşleşen bir kelime bulunduğunda şeçili hale getiriliyor.( Firefox kullananlar için yabancı gelmeyecektir bu arama şekli ;) ) Tekrar Ctrl + I ya bastığımızda bir sonraki eşleşen bulunur. ESC ile aramdan çıkılır, Ctrl + Shift + I ile de bir önceki bulunana gidilir.




Ha unutmadan editörde belirli bir alanı seçmek istiyorsanız da Alt tuşuna basarak seçim işlemini gerçekleştirin.



 
Categories: .NET | Inceleme

September 2, 2007
@ 11:10 PM

GAC (Global Assembly Cache) tüm uygulamaların ortak kullandığı (shared assembly) assembly'lerin tutulduğu özel bir dizindir. Genellikle C:\windows\assembly dizinidir (%windir%\assembly). Bu dizine girip baktığımızda alışık olmadığımız bir yapı ile karşılaşacağız. E özel dedik ya ;)

E peki bu dizini normal dizin gibi görme şansımız yok mu? Var! şöyle ki;

1- Başlat -> Çalıştır -> regedit -> Enter
2- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion bölümüne geliyoruz.
3- Bu kısma "Binary Value" ekleyip ismini DisableCacheViewer verip, değerini de 1 olarak ayarlıyoruz.

İşlem bitti, artık ilgili dizine gidip baktığınızda bildik bir dizin ile karşılacaksınız.Ha bu işlemi neden mi yaptık? Belki bir dll çok hoşumuza gitti, decompile edip inceleyeceğiz, olmadı alıp bunu direk projeme eklicem (xcopy)...Olamaz mı ?


 
Categories: .NET

September 2, 2007
@ 10:52 PM

Çok uzatmadan konuya direk gireyim. Kendi nesnemize ait bir dizimizi debug yaparken aşağıdaki gibi görürüz.

Yine Namespace.NesneIsmi yapısı karşımızda.Hmm diyor nesnemize ait class bildiriminde ToString metodunu override ediyoruz.

public override string ToString()
{
   return Name;
}

Bundan sonra yeniden duruma baktığımızda aşağıdaki gibi daha anlaşılır bir görüntü ile karşılaşıyoruz.


 
Categories: .NET

August 22, 2007
@ 08:52 AM

Sevgili mesai arkadaşım Alper ASMA, 27 Ağustos Pazartesi günü 14:30 - 16:00 saatleri arasında BT Akademi'de ücretsiz WCF semineri verecek. Hem konunun önemli olması hem de bu kadar deneyimli birisinin semineri veriyor olması, seminerin kaçırılmasını olanaksız kılıyor.


 
Categories: .NET | Inceleme

C# kodlarını VB.NET'e, VB.NET kodlarını da C#'a çeviren sayfa için linki ziyaret ediniz ;)

Please visit the following link to convert the C# codes to VB.Net and VB.Net codes to C# ;)

 


 
Categories: .NET | C#

Bitmiyor...Bitmiyor... gelişmeler bitmiyor. İşte bitanesi daha. Web uygulamaları geliştirenler için istemciler ile data arasında URI tabanlı iletişim kuran kütüphane.

Efendim hadise şuymuş ; Silverlight ( güzel bir açıklama için bu linke bir gözatın), Flash gibi araçlar ile istemci tarafında etkili arayüzler sağlayabiliyormuşuz.Ama bu arayüzler ile datalara erişlemiyormuşuz. Ajax gibi teknolojiler ile erişiyormuşuz da işte render idi şuydu buydu tam istediğimiz olmuyormuş. Napacakmışız özel URI'ler ile data tarafına istekde bulunarak XML dosyaları şeklinde dataları alıp client tarafında işleri halledecekmişiz. Misal;

http://myserver/data.svc/Customers dediğimiz de Northwind deki Customers dataları gelecekmiş.. Yok ben where ile şart koşmak istiyorum derseniz http://myserver/data.svc/Customers[ALFKI] diyecekmişiz. Olmadı kardeşim Orders ile de bir ilişki kurmak lazım diyorsanız http://myserver/data.svc/Customers[ALFKI]/Orders buyrun :) Yetmedi mi ? http://myserver/data.svc/Customers[ALFKI]/Orders[Active eq true] işte bi tane daha... Hoppala nerde bunun order by'ı diyenler için http://myserver/data.svc/Customers[ALFKI]/Orders[Active eq true]?$orderby=OrderDate işte bir imkan daha... Bunların yanında da sayfalama yapmak isteyenler için bedava olarak şu şekilde bir URI mevcut : http://myserver/data.svc/Customers?$skip=30&$take=10 

http://myserver/data.svc/Customers[ALFKI] gibi  sorgu sonucunda da aşağıdaki gibi XML sonucları elde ediliyor.

<DataService xml:base="http://myserver/data.svc">

 <Customers>

  <Customer uri="Customers[ALFKI]">

   <CustomerID>ALFKI</CustomerID>

   <CompanyName>Alfreds Futterkiste</CompanyName>

   <ContactName>Maria Anders</ContactName>

   <ContactTitle>Sales Representative</ContactTitle>

   <Address>Obere Str. 57</Address>

   <City>Berlin</City>

   <Region />

   <PostalCode>12209</PostalCode>

   <Country>Germany</Country>

   <Phone>030-0074321</Phone>

   <Fax>030-0076545</Fax>

   <Orders href="Customers[ALFKI]/Orders" />

  </Customer>

 </Customers>
</DataService>

Henüz CTP aşamasında olan bu proje hakkında detaylı bilgiyi burdaki linkten edinebilirsiniz.

 


 
Categories: .NET | Asp.net | Inceleme