Windows uygulamaları geliştirenler projedeki bütün form veya sınıflarda yaşamasını istedikleri değişkenlere Static veya Public özelliğini vermektedir. Web uygulamalarında böyle bir imkan olmadığından her kullanıcı için otomatik olarak hazırlanan Session nesnesinden ve her web uygulaması için hazırlanan ve Application nesnesinden yararlanılmaktadır.
Kullanıcının birisi ilgilendiği web sitesinin ana sayfasını talep etmesiyle birlikte söz konusu kullanıcı için o oturum boyunca yaşayacak HashTable gibi bir yapıya sahip koleksiyon Session nesnesi hazırlanır. Session nesnesi System.Web.SessionState’de bulunan HttpSessionState sınıfının örneğidir. Tahmin edileceği üzere Session nesnesi aynı zamanda Page sınıfının bir özelliğidir. Bu nedenle Session nesnesine sitedeki bütün sayfalardan erişim sağlanabilmektedir.
Sunucu, her istemci için ayrı hazırladığı Session nesnesini benzersiz içeriğe sahip SessionID özelliği ile ayırd etmektedir. Web sitesinin ana sayfasının Load olayını temsil eden metodu aşağıdaki gibi düzenlenirse geçerli oturumun SessionID özelliğinin içeriği sayfaya yazılır.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Me.Response.Write(Session.SessionID)
End Sub
SessionID özelliğinin içeriği 120 bitlik benzersiz bir değerdir. İlk sayfasının Load olayını temsil eden metot bu şekilde düzenlenen site açıldığında aşağıdaki gibi bir sonuç alınır. Bu sırada F5 tuşuna basılıp sayfa tekrar sunucudan talep edildiğinde istemciye farklı bir SessionID değeri gönderilir. Bu değer özel bir algoritma ile rasgele üretilir.

Bu SessionID bilgisi varsayım olarak istemcide bir Cookie’ye yazıldığı için sitedeki başka bir sayfaya geçildiği zaman Session bilgilerinde tutarsızlık olmaz. Doğrusunu söylemek gerekirse programcı olarak geri planda Session nesnesiyle ilgili olarak nelerin yapıldığından çok nasıl kullanıldığıyla ilgilenmek durumundayız. Buna rağmen konu üzerinde düşünmenizi sağlamak için ilk sayfanın Load olayını temsil eden metodu aşağıdaki gibi düzenleyerek Session nesnesinin birkaç özelliğinin içeriğini sayfaya yazdık. Burada içeriklerini sayfaya yazdığımız özelliklerin işlevinden daha sonra söz edilecektir.
Protected SubPage_Load(ByValsender As Object, ByVale AsEventArgs) Handles Me.Load
Me.Response.Write("Session id :"+ Session.SessionID + "<br>")
Me.Response.Write("Yaşama süresi:"+Session.Timeout.ToString()+ "<br>")
Me.Response.Write("Session yeni mi:" + Session.IsNewSession.ToString()+"<br>")
Me.Response.Write("Cookie açık mı:"+ Session.IsCookieless.ToString())
End Sub
Pagesınıfının Session özelliği bir koleksiyona sahiptir ve bu koleksiyon başlangıçta herhangi bir elemana sahip değildir. Session nesnesi anahtar-değer çifti şeklinde düzenlenmiş bilgileri tutabilmektedir. Session nesnesi hakkında adım adım bilgi verebilmek için üzerinde çalıştığım sitenin ilk sayfasının Load olayını temsil eden metodu aşağıdaki gibi düzenledim.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim sayi As Integer
sayi = Session.Count
Me.Response.Write(sayi)
End Sub
Tahmin edeceğiniz gibi HttpSessionState tipindeki Session nesnesinin Count özelliğinde eleman sayısı tutulduğu ve başlangıçta herhangi bir elemana sahip olmadığı için sayfa açılıp bu kod işletildiğinde tarayıcı penceresine 0 yazılır. Şimdi ise Session nesnesine 2 anahtar-değer çifti ekleyeceğim.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Session.Add("FB", "Fenerbahçe")
Session.Add("GS", "Galatasaray")
End Sub
Session nesnesi anahtar-değer çifti şeklinde düzenlenmiş bilgileri eleman olarak tutabildiği için eleman eklenirken kullanılan Add() metodu 2 parametreye sahiptir. 1. parametre anahtar iken 2. parametre değerdir. Session nesnesine anahtar-değer çifti şeklinde düzenlenmiş elemanları Add() metodu yerine aşağıdaki gibi eklemek mümkündür. Aşağıdaki gibi eklenmek istenen eleman mevcutsa söz konusu elemanın mevcut değerini değiştirmiş olursunuz.
Session("FB") = "Fenerbahçe"
Session("GS") = "Galatasaray"
Şimdi de Session nesnesinin mevcut elemanlarını okumayı deneyeceğim. Bu amaçla forma 2 ListBox ve bir Button nesnesi yerleştirip Button nesnesinin Click olayını temsil eden metodu aşağıdaki gibi düzenledim. Bu kod işletildiğinde Session nesnesinin elemanlarının anahtar bilgileri ilk ListBox’a, değerler ise 2. ListBox’a aktarılır.
Protected SubListele_Click(ByValsender As Object, ByVale AsEventArgs) HandlesListele.Click
ListBox1.Items.Add("FB")
ListBox2.Items.Add(Session.Item("FB").ToString())
ListBox1.Items.Add("GS")
ListBox2.Items.Add(Session.Item("GS").ToString())
End Sub
Bu kodda görüleceği gibi Session nesnesinin elemanları okunurken Item özelliğinden yararlanılmaktadır. Session nesnesinin mevcut elemanlarının anahtar bilgileri elde edilirken Keys koleksiyonundan yararlanmak mümkündür. Keys koleksiyonundan nasıl yararlanıldığını aşağıda görebilirsiniz.
Protected Sub Listele_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Listele.Click
Dim sayi As Integer = Session.Count
For i As Integer = 0 To sayi - 1
ListBox1.Items.Add(Session.Keys(i))
ListBox2.Items.Add(Session.Item(Session.Keys(i)))
Next
End Sub
Session nesnesine yani koleksiyonuna eleman eklenirken kullanılan Add() metoduna 1. parametre olarak verilen anahtar bilgisi Session nesnesinde mevcutsa bu kez eleman eklenmeyip mevcut elemanın mevcut içeriği değişir. Buna göre aşağıda verilen satır eleman eklemeye neden olmaz. Burada dikkat edilmesi gereken nokta Session nesnesine eleman eklenirken anahtar bilgileri için küçük-büyük harf ayrımı yapılmaz.
Session("GS") = "Cimbom"
Session nesnesinin koleksiyonuna Add() metodu ile eleman eklediğiniz gibi Remove() metodu ile istediğiniz elemanı silebilirsiniz. Remove() metodu silinecek elemanın anahtar bilgisini parametre olarak almaktadır. Aşağıda verilen satır işletildiğinde anahtar bilgisi “GS” olan eleman Session nesnesinin HashTable koleksiyonundan silinir.
Session.Remove("GS")
Olmayan bir eleman Remove() metodu ile silinmek istenirse herhangi bir tepki alınmaz. Session nesnesinden eleman silmeyi sıra numarasına göre yapmak istiyorsanız Remove() yerine RemoveAt() metodunu kullanabilirsiniz. RemoveAt() metodu aşağıdaki gibi kullanıldığında bütün elemanlar silinir. RemoveAt() metodunun nasıl kullanıldığını anlatmak için sayfaya “Sil” adında Button nesnesi yerleştirip bu nesnenin Click olayı için aşağıdaki gibi kod yazdım.
Protected Sub Sil_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Sil.Click
Dim sayi As Integer = Session.Count
For i As Integer = 0 To sayi - 1
Session.RemoveAt(i)
Next
End Sub
Bu kodda önce Session nesnesinin eleman sayısını öğrendim. Devamında For döngüsüyle elemanları tek tek silmeyi denedim. Ne var ki bu kod hataya neden olur. Çünkü For döngüsünün ilk turunda Session nesnesinin ilk elemanı silinir silinmez Count özelliği güncellenir ve for döngüsünün daha sonraki turlarında olmayan eleman silinmek istenmiş olunur. Bu nedenle silme işlemi aşağıda yapıldığı gibi son elemandan itibaren yapılmalıdır.
Protected Sub Sil_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Sil.Click
Dim sayi As Integer = Session.Count
For i As Integer = sayi - 1 To 0 Step -1
Session.RemoveAt(i)
Next
End Sub
Session nesnesinin bütün elemanlarını bir seferde silmek istiyorsanız RemoveAll() metodunu kullanabilirsiniz. Söz konusu kullanıcı için hazırlanan Session nesnesini tümden yok etmek istiyorsanız Abandon() metodunu kullanabilirsiniz.
Yukarıda Session nesnesinin anahtar ve değer bilgilerini ayrı ListBox’lara aktarırken bir koleksiyon olan Keys özelliğinden yararlandık. .NET Framework ile gelen HashTable sınıfı hakkında bilgisi olanların affına sığınıp konuyu biraz uzatacağım. HashTable sınıfının Keys’dan başka ayrıca elemanların değer bilgilerini içeren Values adında bir özelliği bulunmaktadır. Session nesnesinin ise değer bilgilerini içeren böyle bir özelliği yoktur. Bu nedenle yukarıda anahtar bilgisinden yola çıkıp Item özelliği sayesinde söz konusu elemanın değer bilgisini yani içeriğini okuduk.
Konu üzerinde düşünmenizi sağlamak için Keys koleksiyonun içeriğini ICollection arayüzünün örneğine aktarıp sonra da bu koleksiyonun içeriğini ListBox’a aktaracağım. Session nesnesini bir HashTable nesnesi olarak görüp üzerinde daha fazla durmak mümkün olsa bile burada kesiyorum.
Protected Sub Listele_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Listele.Click
Dim anahtarlar As ICollection
anahtarlar = Session.Keys
For Each eleman As Object In anahtarlar
ListBox1.Items.Add(eleman)
ListBox2.Items.Add(Session.Item(eleman))
Next
End Sub
Yukarıda işaret edildiği gibi Session nesnesi System.Web.SessionState’de bulunan HttpSessionState sınıfının örneğidir. Konu Session nesnesi olduğunda işin özü şudur: Kullanıcının birisi Web sitesini ziyaret ettiğinde sunucunun belleğinde bu kullanıcı için herhangi bir elemana sahip olmayan bir Session nesnesi hazırlanıyor. Bu Session nesnesi Page sınıfının bir özelliği olduğu için sayfa dahilinde kullanmak mümkün oluyor. Programcı olarak bu koleksiyonda istediğimiz bilgileri tutup bu bilgileri sitedeki bütün sayfalarda kullanabiliriz. Bu konuda bilgi vermek için üzerinde çalıştığım sitenin ilk sayfasına 2 TextBox ve bir Button yerleştirip Button nesnesinin Click olayını temsil eden metodu aşağıdaki gibi düzenledim.
Protected Sub Gonder_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Gonder.Click
Session.Add("Ad", TextBox1.Text)
Session.Add("Soyad", TextBox2.Text)
Response.Redirect("Default2.aspx")
End Sub
Bu kodda önce Session nesnesine “Ad” ve “Soyad” adında 2 eleman ekledim. Elemanların içeriklerini TextBox’lardan okudum. Devamında Page sınıfının Response özelliğinin Redirect() metodu ile sitedeki ikinci sayfaya geçtim. İkinci sayfanın Load olayını temsil eden metodu aşağıdaki gibi düzenleyerek Session nesnesinin bu 2 elemanın içeriğini okuyup bu sayfaya yazdım.

Kullanıcının karşısında sitedeki ilk sayfa varken “Gonder” adını verdiğim düğme tıklanıp sitedeki 2. sayfa sunucudan talep edildiğinde sunucu aynı Session nesnesini 2. sayfanın Session özelliğine aktarmaktadır. Dolayısıyla ilk sayfada değiştirilen Session nesnesi 2. sayfada kullanılabilinmektedir. Şimdi ise sitedeki ikinci sayfaya “Sil” adında bir düğme yerleştirip mevcut Session nesnesinden bir elemanı silip sitedeki 3. sayfaya geçeceğim.
Protected Sub Sil_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Sil.Click
Session.RemoveAt(1)
Me.Response.Redirect("Default3.aspx")
End Sub
Bu kod işletildiğinde Sessin nesnesinin 2. elemanı silinir ve sitedeki 3. sayfa sunucudan talep edilir. Dolayısıyla Browser penceresinde sitedeki 3. sayfanın içeriği varken geçerli sınıfın yani Page sınıfının Session özelliğinde 2. elemanı silinmiş bir koleksiyon olacaktır.
Session nesnesi hakkında şimdiye verilen bilgilere göre Session nesnesinin elemanlarının değer bilgilerinin tipi Object’tir. Bu nedenle Session nesnesinden istenen tipteki bilgileri saklamak mümkündür. Bu konuda bilgi vermek için önce bir ArrayList nesnesi hazırlayıp bazı futbol takımlarının adını aktardım. Ardından bu ArrayList nesnesini Session’da sakladım.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim liste As New ArrayList()
liste.Add("Fenerbahçe")
liste.Add("Trabzonspor")
liste.Add("Beşiktaş")
liste.Add("Galatasaray")
Session.Add("takimlar", liste)
End Sub
Bu hazırlıktan sonra sitedeki 2. sayfanın Load olayını temsil eden metodu aşağıdaki gibi düzenledim. Bu kodda önce ArrayList nesnesi hazırlayıp Session nesnesinin “takimlar” adını verdiğim üyesinin içeriğini dönüştürüp bu ArrayList nesnesine aktardım. Session nesneleri sunucuda saklandığı için büyük miktarda bilgiyi Session’da tutmak performans sorunlarına neden olabilir.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim takim_listesi As New ArrayList()
takim_listesi = CType(Session("takimlar"), ArrayList)
For i As Integer = 0 To takim_listesi.Count - 1
ListBox1.Items.Add(takim_listesi(i))
Next
End Sub
Bu anlatılanlara göre Session nesnesinin içeriğine sitedeki bütün sayfalarda ve Global.asax dosyasında erişim sağlamak mümkündür. Ancak sitedeki Page sınıfının mirasçısı olmayan bir sınıfta Session nesnesine gerek duyduğunuzda durum değişir. Bu konuda bilgi vermek üzerinde çalıştığım sitede App_Code adında özel klasör hazırlayıp aşağıdaki gibi bir kod dosyası hazırlayıp bu klasöre kaydettim.

Bu kod dosyasında hazırladığım sınıfın yapıcı metodunda önce System.Web.SessionState’de bulunan HttpSessionState tipinde bir değişken tanımladık. Ardından HttpContext.Current nesnesinin Session özelliğini bu değişkene aktardık. Her ne kadar yukarıdaki sayfalarda Session nesnesinin Page sınıfının bir özelliği olduğunu işaret etmiş olsak bile Page sınıfı, Session nesnesinin gerçekte tıpkı bu kodda yaptığımız gibi HttpContext.Current’ten almaktadır. HttpCurrent sınıfının Current özelliği Page sınıfına yalnızca Session nesnesini sağlamıyor. Benzer şekilde Page sınıfı Application, Responce ve Server gibi nesneleri de sağlamaktadır.
Yukarıda verilen kodda HttpContext sınıfının Session özelliğini tanımladığım değişkene aktardıktan sonra FileStream ve StreamWriter nesneleri hazırladım. En son olarak Session nesnesinin bütün içeriğini okuyup FileStream nesnesi sayesinde hazırladığım dosyaya yazdım. Devamında sitedeki ilk sayfanın Load olayını temsil eden metodu aşağıdaki gibi düzenledim.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Session.Add("FB", "Fenerbahçe")
Session.Add("GS", "Galatasaray")
Session.Add("BJK", "Beşiktaş")
Session.Add("TS", "Trabzonspor")
Dim nesne As New dosyaya_yaz()
End Sub
Bu kodda önce Session nesnesine birkaç eleman ekledikten sonra yukarıda hazırlayıp “dosyaya_yaz” sınıfının örneğini aldık. Bu sınıfın yapıcı metodunda Session nesnesinin içeriğini okuyup text dosyasına yazdığım için siteyi görüntüleyince aşağıdaki gibi bir içeriğe sahip text dosyası hazırlandı.

Session Nesnesi ve Cookie Desteği
Web sunucusu Session nesnesinin içeriğini orijinal ayarlara göre 20 dakika boyunca korur. Kullanıcı 20 dakika boyunca herhangi bir işlem yapmazsa Session nesnesinin içeriği silinir. Bu süreyi değiştirmek istiyorsanız Web.config dosyasına aşağıda yapıldığı gibi system.web düğümünün içine sessionState düğümünü ekleyip timeout niteliğini ayarlamanız gerekir. Session bilgilerinin saklanma süresinin 20 dakika olması genel kabul gören bir süredir.
<system.web>
<sessionState timeout= "10" />
</system.web>
Yukarıda işaret edildiği gibi sitedeki sayfaların arasında dolaşırken istemcide SessionId bilgisi saklanırken özel olarak hazırlanan bir Cookie’den yararlanılmaktadır. Kullanıcı tarayıcısını Cookie’lere kapatmışsa sorunlar yaşanabilir. Bu konuda bilgi vermek için 2 sayfaya sahip bir web sitesi hazırlayıp ilk sayfanın Load olayını temsil eden metodu aşağıdaki gibi düzenledim.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As System.EventArgs) Handles Me.Load
Session.Add("FB", "Fenerbahçe")
EndSub
Bu metot sayesinde herhangi bir kullanıcı oturum açtığında Session nesnesi anahtar değeri “FB” olan bir elemana sahip olur. Ardından ilk sayfaya “Git” adında bir button nesnesi yerleştirip bu nesnenin Click olayını temsil eden metodu aşağıdaki gibi düzenledim. Metot adına argo bir kelime ekleyerek yerli programcılık kitabı yazarlarının muhtemel nesne adı çalma suçlamasından yırtmayı hedefledim. Bakarsınız programcılık kitapları yazan birisi beni nesne adını çalmakla dava eder.
ProtectedSub Git_lan_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Gonder.Click
Response.Redirect("Default2.aspx")
EndSub
Bu satır sayesinde sitedeki 2. sayfa browser penceresine getirilir. Session nesnesinin anahtar bilgisi FB olan elemanın değer bilgisini ikinci sayfaya yazmak için bu sayfanın Load olayını temsil eden metodu aşağıdaki gibi düzenledim.
PartialClass Default2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Me.Response.Write(Session("FB"))
End Sub
EndClass
Buraya kadar Cookie desteğiyle ilgili olarak yazılanlarda sizin için orijinal ve yeni bir şey olmayabilir. İşte asıl soruna işaret edecek soru: Ya kullanıcı Cookie desteğini kapattıysa? Madem Session nesnesinin içeriği sunucuda tutuluyor ve oturum boyunca sitedeki sayfaların arasında dolaşılırken tutarsızlık olmasın diye istemci bilgisayarda bir cookie hazırlanıyor Cookie desteği kapalıyken sitedeki sayfaların arasında dolaşıldığında Session bilgilerine erişilemez olur. Başka bir deyişle istemcinin bilgisayarında cookie desteği yoksa session bilgileri yalnızca ana sayfada yaşar. Bu konuda bilgi vermek için sitedeki ikinci sayfanın Load olayını temsil eden metodu aşağıdaki gibi düzenledim.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim sayi As Integer
sayi = Session.Count
If sayi = 0 Then
Me.Response.Write("Bilgisayarınızda Cookie desteği yok")
Else
Me.Response.Write(Session("FB"))
End If
EndSub
Tabi programcı sitenin daha önce görüntülenen sayfalarında Session nesnesine eleman eklemediyse veya mevcut elemanların tümünü sildiyse bu kod sizi yanıltabilir.İstemci bilgisayarda Cookie desteğinin kapatılmış olabileceğini öngörüyorsanız ve SessionID bilgisinin sitedeki bütün sayfalarda yaşamasını istiyorsanız Web.config dosyasında ayarlama yapabilirsiniz. Web.config dosyasında sessionState düğümünde cookieless ayarını true yaparsanız SessionID bilgisi istemcinin bilgisayarında Cookie yerine url’de tutulup sayfalar arasında dolaşılır.
<sessionState timeout= "20" cookieless="true"/>
Cookieless ayarı true iken istemcide ister cookie desteği olsun ister olmasın SessionID bilgisi cookie yerine url’ye eklenir. Aşağıda verilen ekran görüntüsünde url’ye eklenen SessionID bilgisini görebilirsiniz.

Diyelim ki Web.config dosyasında cookieless ayarı false’dir ve SessionID bilgileri istemcide otomatik olarak hazırlanan Cookie’de tutulmak üzere ayarlama yapılmıştır. Kullanıcının birisi bilgisayarında Cookie desteğini kapatıp ondan sonra siteyi ziyaret ettiğinde sayfalar arasında dolaşırken Session bilgilerinden yararlanılamaz.
Bu tespiti yaptıktan sonra bir şekilde web.config dosyasındaki cookiless ayarını true yaparsanız sunucuda web uygulaması yeniden başlatılır ve mevcut Session bilgileri kaybolur. İstemcide Cookie desteğinin olup olmadığını öğrenirken Session nesnesinin IsCookieless özelliğine bakabilirsiniz.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As System.EventArgs) Handles Me.Load
Dim durum As Boolean
durum = Session.IsCookieless
If durum = False Then
Me.Response.Write("Bilgisayarınızda Cookie desteği yok")
Else
Me.Response.Write(Session("FB"))
End If
EndSub
Kullanılan tarayıcı programının Cookie desteğinin olup olmadığını öğrenirken aşağıdaki gibi kod yazmak mümkündür.
Dimtarayici As HttpBrowserCapabilities
tarayici = Request.Browser
Response.Write(tarayici.Cookies.ToString())
* Meraklısı İçin Notlar
Şimdiye kadar yüzlerce makalede, ASP.NET konulu onlarca kitapta Session mekanizmasından söz edildi. Bu makalelerin büyük bir yüzdesinde kavramsal yanlışlar vardı. Tabi bu makale ve kitaplardaki yanlışlıkları burada tek tek sayıp yeni düşmanlar kazanma yolunu gitmeyeceğim. Şimdi gelin bu Session konusunu bir de Memik Yanık’tan okuyun. Her ne kadar Session nesnesi hakkında yazdıklarım bu kadarla sınırlı olmasa bile ASP.NET konulu kitaplarda bu kadar bilgi bile yoktur.
----------------------------------------------------------------------
Visual Basic 9.0 Kitabı
Daha kapsamlısı yoktur,
Daha kolay okunanı yoktur
Bu kadar ileri düzey bilgi içeren başka bir Visual Basic kitabı yoktur.

.NET uyumlu Visual Basic programlama dilini öğrenmek, eksik bilgilerinizi tamamlayıp Visual Basic uzmanı olmak isteyenler için dünyanın en iyi kitaplarından birisi Memik YANIK tarafından Türkçe olarak hazırlandı. Kitaptan alınıp aşağıda linki verilen bölümü incelediğinizde bize hak vereceksiniz.
http://www.memikyanik.net/application-sinifi-ve-visual-basic-projeleri-makalesi/30.aspx
Peşinen söyleyelim bu kitapla ilgilenenlere fikir versin diye web’de yayınlanan bu bölümde verilen bilgileri yerli kaynakların hiç birinde, yabancı kaynakların büyük bir çoğunluğunda bulamazsınız. Kitap hakkında ayrıntılı bilgiyi aşağıda linki verilen makalede bulabilirsiniz.
http://www.memikyanik.net/visuan-basic-90-kitabim-hakkinda-yazisi/29.aspx
Bu kitabı edinmek istiyorsanız aşağıda verilen adresten temin edebilirsiniz.
http://www.hepsiburada.com/visual-studio-2008-ile-microsoft-visual-basic-9.0/productDetails.aspx?categoryid=211651&productid=kseckin0001