Arşiv

Etiketlenen yazılar .net

C# FolderBrowserDialog seçili dizini değiştirmek

04 Eylül 2010 Yorum yapılmamış

.Net ile FolderBrowserDialog sınıfı sayesinde, Dizin Seçme Dialog Penceresi oluşturabiliyoruz.

OpenFileDialog sınıfını kullanırak Dosya Seçme Dialog Kutusu açtıracağımız zaman, varsayılan dizini InitialDirectory özelliği ile belirleyebiliyoruz.

FolderBrowserDialog sınıfının InitialDirectory özelliği olmadığı için, varsayılan dizini bu özelliği ayarlayarak belirleyemiyoruz.

Fakat yardımımıza SelectedPath özelliği yetişiyor;

FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.Description = "Lütfen aşağıdaki listeden bir dizin seçiniz.";
dialog.RootFolder = Environment.SpecialFolder.Desktop;
dialog.SelectedPath = @"C:\Program Files";
if (dialog.ShowDialog() == DialogResult.OK)
{
	Console.WriteLine(dialog.SelectedPath);
}

Örnek kodu çalıştırdığımızda aşağıdaki ekranı görmelisiniz;

CSharp Browse Folder Dialog

C# Global Assembly Cache içine Assembly yüklemek

29 Temmuz 2010 Yorum yapılmamış

C# ile geliştirdiğimiz uygulamalar büyüdükçe, uygulama içerisinde ortak kullandığımız yapıları tekilleştirme eğilimi gösteririz. Örneğin; veritabanına erişim, e-posta gönderme, hata geribildirimleri, session kontrolü, vs.

Tekilleştirme yapmak için, ortak metodları, ortak bir sınıf içerisinde toplar ve projenin her yerinde ilgili sınıf üzerinden kullanırız. Örneğin;
DAL.ExecuteQuery();
DAL.ExecuteProcedure();
DAL.GetDataTable();

Ortak metodlar çoğaldıkça, ortak bir sınıf yeterli olmaz ve ortak sınıflar oluşturmamız gerekir.Örneğin;
Hata.Log(ex);
DAL.ExecuteQuery(“sorgu”, “parametreler”);
EMail.Send(“alıcı”, “konu”, “içerik”);

Eğer ortak sınıflarımızı çeşitli projeler arasında paylaşmamız gerekiyorsa, bu sınıfları dll assembly‘ler içerisinde toplarız.

Daha sonra her projede, dll assembly’yi projenin referanslarına ekleriz.

Birden fazla projede referans olarak göstereceksek, dll assembly’yi ortak bir alana yüklememiz daha doğru olacaktır.

Böylece ilgili dll’de yapacağımız bir versiyon güncellemesi aynı anda birden fazla projede etkin olacaktır.

.Net dll’lerini koyabildiğimiz ortak alana Global Assembly Cache (kısaca GAC) denmektedir.

Bir .Net assembly’sini GAC‘a eklemek için, .Net Framework ile birlikte gelen gacutil aracını kullanmalıyız. Örnek Kullanım : gacutil -i [assembly_yolu]

Komut satırından gerekli parametreleri vererek gacutil aracını kullanabiliriz.

Eğer, bir assembly’yi GAC’a programatik bir yöntemle eklemek istiyorsak, System.EnterpriseServices.Internal namespace’inde yeralan Publish sınıfının GacInstall method’unu kullanmalıyız.

İlk olarak kodumuzun using kısmına System.EnterpriseServices.Internal namespace’ini ekleyelim;

using System.EnterpriseServices.Internal;

Daha sonra yapmamız gereken, Publish sınıfından yeni bir örnek oluşturup, GacInstall method’unu çağırmak.

try
{
	Publish gac = new Publish();
	gac.GacInstall("yuklenecekassemblyyolu");
}
catch (System.Security.SecurityException se)
{
	///Muhtemelen yetki eksikliğinden dolayı uygulamamız GAC'a erişemedi
}

Özellikle, kendi kurulum uygulamamızı yazacaksak, GAC‘a programatik erişmemiz gerekecektir.

.Net 4 COM İyileştirmeleri – Office Uygulamarı ile Çalışmak

03 Mart 2010 4 yorum

.Net 4.0 COM İyileştirmeleri başlığı altında birçok yeni yeteneğe sahiptir. Şubat ayında verdiğim seminerlerden C# 4.0 Yenilikleri – 2 seminerinde COM İyileştirmeleri başlığında özellikle bu yeniliklerden bahsettim.

BilgeAdam‘daki bir öğrencimin sorusu üzerine bu yazımda Excel ve Word kullanımına ilişkin bir örnek yapacağım.

Öncelikle yeni bir Console Application projesi oluşturalım ve referanslara

  • Microsoft.Office.Interop.Excel
  • Microsoft.Office.Interop.Word

referanslarını ekleyelim.

Bu örnekte yapmak istediğimiz;

  • Bilgisayarımızda o anda en çok hafıza alanı kullanan 10 uygulamanın adını ve kulandığı hafıza miktarını yeni bir Excel dosyasında iki sütuna alt alta yazmak
  • Aynı excel dosyasının ikinci bir sheet’ine bu tablodan bir chart üretmek
  • Bu chart’ı kopyalayıp, yeni açacağımız bir Word dosyasına yapıştırmak

Hazırsanız, Program.cs dosyamıza aşağıdaki kodları yazmakla başlayalım;

using direktiflerini yazdığımz yere

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
using System.Diagnostics;

satırlarını ekleyelim

Yeni bir Excel dosyası oluşturmak ve görünür kılmak için;

var excel = new Excel.Application();
excel.Visible = true;

Bu Excel dosyasına yeni bir sheet eklemek ve tablonun başlıklarını yazmak için;

excel.Workbooks.Add();
excel.Cells[1, 1].Value = "Uygulama Adı";
excel.Cells[1, 2].Value = "Hafıza Kullanımı";

Tabloya en çok hafıza kullanan uygulamaları eklemek için;

int i = 2;
foreach (var p in Process.GetProcesses().OrderByDescending(p => p.WorkingSet64).Take(10))
{
	excel.Cells[i, 1].Value = p.ProcessName;
	excel.Cells[i, 2].Value = p.WorkingSet64;
	i++;
}

Tabloyu Excel dosyasında yeni bir sheet içerisine chart olarak eklemek için;

Excel.Range range = excel.Cells[1, 1];
Excel.Chart chart = excel.ActiveWorkbook.Charts.Add(After: excel.ActiveSheet);
chart.ChartWizard(Source: range.CurrentRegion, Title: Environment.MachineName + " Toplam Hafıza Kullanımı");
chart.ChartStyle = 45;

Tabloyu panoya kopyalamak, yeni bir Word dosyası açıp, içine yapıştırmak için;

chart.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);

var word = new Word.Application();
word.Visible = true;
word.Documents.Add();
word.Selection.Paste();

Tüm kodları tekrar yazarsak;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
using System.Diagnostics;

namespace COMIyilestirmeleri_OfficeUygulamasi
{
	class Program
	{
		static void Main(string[] args)
		{
			var excel = new Excel.Application();
			excel.Visible = true;
			excel.Workbooks.Add();
			excel.Cells[1, 1].Value = "Uygulama Adı";
			excel.Cells[1, 2].Value = "Hafıza Kullanımı";
			int i = 2;
			foreach (var p in Process.GetProcesses().OrderByDescending(p => p.WorkingSet64).Take(10))
			{
				excel.Cells[i, 1].Value = p.ProcessName;
				excel.Cells[i, 2].Value = p.WorkingSet64;
				i++;
			}
			Excel.Range range = excel.Cells[1, 1];
			Excel.Chart chart = excel.ActiveWorkbook.Charts.Add(After: excel.ActiveSheet);
			chart.ChartWizard(Source: range.CurrentRegion, Title: Environment.MachineName + " Toplam Hafıza Kullanımı");
			chart.ChartStyle = 45;
			chart.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);

			var word = new Word.Application();
			word.Visible = true;
			word.Documents.Add();
			word.Selection.Paste();
		}
	}
}

C# Obsolete Attribute

21 Ocak 2010 Yorum yapılmamış

Yaklaşık olarak .Net Framework içerisinde binlerce class ve binlerce class içerisinde milyonlarca method vardır.

Her yeni .Net Framework versiyonunda bu class‘ların ve method‘ların bir kısmı yeni yöntemler / yeni teknikler ile baştan yazılıyor.

Bazen bu değişiklikler o kadar büyük oluyor ki, ilgili class veya method yeni bir isimle baştan yazılıyor ve eskisinin artık kullanılmaması öneriliyor.

Önceki Framework versiyonlarında yanlış konumlandırdıkları class veya method‘ları taşıdıkları durumlarda da aynı durum geçerli.

Geriye yönelik uyumluluktan dolayı, kullanılmaması önerilen class veya method‘lar üç versiyon daha yerinde durmaya devam eder.

Ama derleme zamanında uygulama geliştiriciye, ilgili class veya method‘un Obsolete olduğunu bildirir ve kodunu güncellemesini ister.

Bu özellik Obsolete Attribute sayesinde sağlanır.

Eğer biz de yazdığımız projelerimizde çeşitli class veya method’ları Obsolete yapmak istersek, aşağıdaki kodda gözüktüğü gibi yapabiliriz;

[Obsolete]
public class EskimisClass
{
	///
}

veya

[Obsolete("Bu method v4.5 versiyonundan itibaren kaldırılacak, lütfen yerine Ntv.YeniMedya.Veritabani sınıfında bulunan Baglan() methodunu kullanın. Ayrıntılı bilgi için http://www.xyz.com/Baglan sayfasına bakabilirsiniz")]
public void VeritabaniBaglan()
{
	///
}

Yukarıdaki kodda bulunan VeritabaniBaglan() method’unu kullanırken ve projemizi derlerken aşağıdaki ekranlar ile karşılaşırız;

Obsolete Method

Obsolete Method Error

.Net 4.0 Evreni – .Net 4.0 Universe

19 Ocak 2010 Yorum yapılmamış

.Net 4.0 Evreni

Microsoft .Net Framework ailesinin en yeni üyesi olacak 4.0 versiyon için aşağıdaki PDF dokümanını yayınladı.

PDF Formatında indirmek için buraya tıklayınız.

C# ile WebCrawler Uygulaması

24 Aralık 2009 5 yorum

Google, Bing, Yahoo gibi arama motorları, internetteki sayfaları indexlemek için web crawler denilen programcıklar kullanırlar.

Crawler’ların çalışma mantığı basittir;

  1. Web sayfasına git
  2. Sayfanın içeriğini indexle
  3. Sayfadaki her link için 1. adıma geri dön

Crawler’ın, sayfadaki linkleri bulabilmesi anahtar adımdır.

Yazacağımız uygulamada, bir web crawler gibi sayfadaki linkleri bulacağız.

Ekran görüntüsündeki formu oluşturduktan sonra, Buton‘un Click olayına ait kodu yazmaya başlayalım.

private void btnLinkleriBul_Click(object sender, EventArgs e)
{
	WebRequest wr = WebRequest.Create(txtAdres.Text);
	WebResponse ws = wr.GetResponse();
	StreamReader sr = new StreamReader(ws.GetResponseStream(), Encoding.UTF8);
	string response = sr.ReadToEnd();
	sr.Close();
	ws.Close();

	Regex r = new Regex("<a.+href=\"http.+://(.+)\">(.*)</a>");
	foreach (Match m in r.Matches(response))
	{
		string link = m.Groups[1].Value;
		if (link.IndexOf("\"") > -1)
			link = link.Substring(0, link.IndexOf("\""));
		string metin = m.Groups[2].Value;

		ListViewItem oItem = new ListViewItem(new string[] { metin, link });
		lvSonuc.Items.Add(oItem);
	}
}

Code Challenge #1 ve C# ile Google PageRank Bulma yazılarında kullandığım tekniğin aynısı ile sayfanın içeriğini string değişkene alıyoruz.

WebRequest wr = WebRequest.Create(txtAdres.Text);
WebResponse ws = wr.GetResponse();
StreamReader sr = new StreamReader(ws.GetResponseStream(), Encoding.UTF8);
string response = sr.ReadToEnd();
sr.Close();
ws.Close();

Daha sonra, Regex sınıfından yeni bir örnek oluşturup (constructer’ına verdiğimiz parametre önemli), dönen sonuç kümesinin içeriğini ListView kontrolüne dolduruyoruz.

Eğer sayfanın içeriğini tuttuğumuz değişkeni veritabanına yazsak, ve sayfada bulduğumuz her link için bu adımları tekrar yapsak, tam bir web crawler uygulaması yazmış olacaktık.

Ama bu noktadan itibaren uygulamayı geliştirmeyi size bırakıyorum (BilgeAdam’daki öğrencilerime hep dediğim gibi, “Bundan sonrası size ödev!”)

Projenin bu halini şuradan indirebilirsiniz.

TPL (Task Parallel Library) – Task Class

06 Aralık 2009 Yorum yapılmamış

.Net 4.0 ile birlikte gelecek güzel class’lardan bir tanesi de Task class’ı.

Task class’ı ve TPL (Task Parallel Library) ile birlikte gelen diğer class’lar sayesinde paralel programlama .net framework ile desteklenir hale geliyor.

TPL_Task_1

Yandaki görselde görebileceğiniz gibi, TPL (Task Parallel Library) ve PLINQ (Parallel LINQ) .Net Framework 4.0 ile gelen en önemli özellikler.

Paralel programlamanın performans’a katkısını MSDN’de yer alan şu iki makale’de okuyabilirsiniz;

Parallel Programming in .Net Framework

Parallel Performance

Gene MSDN’de yer alan şu sayfalardan da .net 4 ile gelecek yeni yapıları öğrenebilirsiniz;

Data Structures for Parallel Programming

Task Parallelism (Task Parallel Library)

Introduction to Tasks

Task class’ını kullanarak, Thread yönetme maliyetlerinden kurtularak kolaylıkla Multi-Core uyumlu, Asenkron çalışabilen kodlar yazabiliriz.

Task class’ından yeni bir örnek oluşturmak için;

Aşağıdaki gibi yeni bir instance oluşturup, daha sonra Start method’u ile başlatabiliriz.

Task t0 = new Task(() =>
	MessageBox.Show("Task Örneği 1")
);
t0.Start();

Veya, aşağıdaki kodda yazdığım gibi, Task class’ının singleton static Factory property’sinin StartNew method’u ile hem tanımlayıp, aynı anda başlatabiliriz.

Task t1 = Task.Factory.StartNew(() =>
{
	string Mesaj = "Birinci çalışacak..";
	MessageBox.Show(Mesaj);
});

Örneğini oluşturduğumuz Task nesnesi, başlatılana kadar hafızada bekler. Başlatıldığında, ayrı bir thread’de çalışacağından dolayı, uzun süren işlerin arayüz’ü kilitlemesini önlemek için kullanılabilir.

Birden Fazla Task’ın peşpeşe çalışması sağlanabilir;

Task t2 = Task.Factory.StartNew(() =>
{
	MessageBox.Show("Birinci çalışacak..");
}).ContinueWith((t) =>
{
	MessageBox.Show("İkinci çalışacak..");
}).ContinueWith((t) =>
{
	MessageBox.Show("Üçüncü çalışacak..");
});

Veya birden fazla Task’ın aynı anda çalışması da sağlanabilir;

Task t3 = Task.Factory.StartNew(() =>
{
	Task c1 = Task.Factory.StartNew(() =>
	{
		MessageBox.Show("Aynı anda çalışacak..");
	}, TaskCreationOptions.AttachedToParent);

	Task c2 = Task.Factory.StartNew(() =>
	{
		MessageBox.Show("Aynı anda çalışacak..");
	}, TaskCreationOptions.AttachedToParent);
});

TaskCreationOptions parametresine verdiğimiz AttachedToParent değerine dikkat!.. Bu sayede c1 ve c2 Task’ları t3 Task’ının Child Task‘ları haline geldi, t3 Task’ı da Parent Task oldu.

ClickOnce ve ApplicationDeployment class’ı

04 Aralık 2009 Yorum yapılmamış

Kısa Sınav – 3 yazımda belirttiğim gibi, ClickOnce ile deploy ettiğiniz uygulamalarda, güncellemeleri programatik olarak kontrol etmek için ApplicationDeployment class’ını kullanırız.

Bu yazımda, ApplicationDeployment class’ının kullanımını anlatmaya çalışacağım.

Öncelikle bilinmesi gereken, ApplicationDeployment class’ından yeni bir instance oluşturamazsınız. Çünkü public bir constructor’ı yoktur.

KisaSinav3_1

ApplicationDeployment class’ından yeni bir örnek oluşturmak için, gene ApplicationDeployment class’ının static ve singleton CurrentDeployment property’sini kullanırız.

KisaSinav3_2

Artık elimizde bir değişken olduğuna göre, bu değişkeni kullanarak uygulamamızda güncelleme olup-olmadığını sorgulayabiliriz.

Bunun için kullanabileceğimiz fonksiyonlar;

KisaSinav3_3

CheckForUpdate()

Uygulamanın yeni versiyonu olup-olmadığını kontrol eder, geriye bool tipinde değer döner.

CheckForUpdateAsync()

CheckForUpdate() fonksiyonu ile aynı işi yapar, fakat asenkron çalışabilir.

Versiyon kontrolü tamamlandığında CheckForUpdateCompleted event’i otomatik olarak çağırılır.

CheckForDetailedUpdate()

Uygulamanın yeni versiyonu olup-olmadığını kontrol eder, geriye UpdateCheckInfo tipinde değer döner.

KisaSinav3_4

Genelde CheckForDetailedUpdate() fonksiyonunu çağırmakta fayda vardır. Çünkü, daha güncel versiyonun çıktığını bulduğumuzda, kullanıcıya mesaj vermek isteyeceğiz. Mesaja yazacağımız detaylı bilgiye UpdateCheckInfo class’ı aracılığıyla ulaşabiliriz. Bu bilgiyi bize CheckForDetailedUpdate() fonksiyonu döndürüyor.

UpdateCheckInfo class’ının member’ları;

AvailableVersion

Uygulamanın güncellenebilir son versiyonunun versiyon bilgisi. (Version tipinde değer döner)

IsUpdateRequired

Uygulamanın ClickOnce ile deploy’u sırasında “UpdateRequired” seçeneğinin seçilip seçilmediğinin bilgisi. (bool tipinde değer döner) Eğer true değer içeriyorsa, kullanıcıya mesaj verilmeli, çalışan uygulaman kapatılmalı ve güncelleme yapılmalıdır.

MinimumRequiredVersion

Kullanıcıda bulunması gerekli minimum versiyon bilgisi. (Version tipinde değer döner)

UpdateAvailable

Kullanıcıda çalışan uygulamadan daha güncel bir versiyonun bulunup bulunmadığı bilgisi. (bool tipinde değer döner)

UpdateSizeBytes

Güncellenecek dosyaların toplam boyutu bilgisi. (long tipinde değer döner)

Kısa Sınav – 3

01 Aralık 2009 Yorum yapılmamış

ClickOnce ile deploy ettiğiniz uygulamanızda, programatik olarak güncelleme olup olmadığını kontrol etmek istiyorsunuz.

Hangi class’tan örnek oluşturmanız lazım?

  • Module
  • ApplicationDeployment
  • Assembly
  • DeploymentServiceCom

Sorunun doğru cevabı için; Devamını oku…

PDC 2009′da Silverlight 4 Beta yayınlandı

24 Kasım 2009 Yorum yapılmamış

18 Kasım 2009 tarihinde, Microsoft PDC’09 (Microsoft Proffessional Developers Conference 2009) konferansında konuşmacı Scott Gutherie, Silverlight 4 Beta’nın yayınlandığını duyurdu.

Resmi sitesi silverlight.net‘te yer alan şu sayfadan ayrıntılı bilgiye ulaşabilirsiniz.

Channel9′da yeralan video‘dan yenilik olarak nelerin geleceğini izleyebilirsiniz.

Yeniliklerden kısaca bahsetmek gerekirse;

  • Yazdırma ile ilgili yenilikler
  • Zengin Metin Alanı kontrolünün eklenmesi
  • Datagrid üzerinde kolonlara otomatik genişlik verilebilmesi ve Kopyalama desteği
  • Fare tekerlerine gelen destek
  • Sağ tuş desteği
  • Windows’un panosuna erişim imkanı
  • Browser içerisindeki silverlight nesnesinin sürükle-bırak tekniğinde bırakma noktası olarak belirlenebilmesi
  • Webcamerası ve Mikrofon desteği
  • PNG dosya türünün tüm formatlarına tam destek
  • Out-Of-Browser moduna daha çok destek
  • WebBrowser kontrolü
  • İstemci bilgisayarın dosya sistemine erişim yeteneği
  • Google Chrome desteği
  • Multi-touch desteği

Listenin tamamına ve açıklamalarına buradan ulaşabilirsiniz.

Silverlight ekibi 4. versiyonun betasını yayınlarken, Expression Blend ekibi de boş durmamış ve Silverlight 4 çıktı üretebilen Expression Blend versiyonunun beta’sını yayınlamış.

Microsoft Download’da yer alan şu sayfadan Expression Blend Preview for .Net 4 versiyonunu indirebilirsiniz.