Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Instrumentation (Management Events)

System.Management namespace’i altında bulunan sınıflar ile sistem araçlarını ve uygulamalarını ve WMI (Windows Management Instrumentation) ‘ı yönetebiliriz. DirectoryObjectSearher ile WMI kaynaklarına programatik olarak erişmemiz mümkündür. Bu arama işlemi SQL sorgularına benzer bir sintaks ile yapılır.

 

Aşağıdaki fonksiyona bir sorgu verilerek işletim sistemine,harddiske,memory e kısacası sistem kaynaklarını bir listview içerisine doldurabiliriz.

publicstaticvoid ListObjects(string query,ManagementObjectSearcher mos,ListView lv)

{

    try

    {

        lv.Items.Clear();

        lv.Visible = true;

        mos.Query = newObjectQuery(query);

 

        foreach (ManagementObject mo in mos.Get())

        {

            foreach (PropertyData pd in mo.Properties)

            {

                if (mo[pd.Name] != null)

                {

                ListViewItem lvi = newListViewItem();

                ListViewItem.ListViewSubItem lvi2 = newListViewItem.ListViewSubItem();

                vi.Text = pd.Name + ” : “+ pd.Value;

                lv.Items.Add(lvi);

 

                lvi2.Text = mo[pd.Name].ToString();

                lvi.SubItems.Add(lvi2);

                        }

                    }

                }

            }

    catch (Exception ex)

    {

        MessageBox.Show(ex.StackTrace);

    }

}
//İşletim sistemi bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_OperatingSystem”, mos, listView1);
//Bilgisayar bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_ComputerSystem”, mos, listView1);
//İşlemci bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_processor”, mos, listView1);
//Bios bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_bios”, mos, listView1);
//Timezone bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_timezone”, mos, listView1);
//Memory bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_LogicalMemoryConfiguration”, mos, listView1);
//Video Controller bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_VideoController”, mos, listView1);

//C,D,E gibi mantıksal disk bilgilerini almak

ManageClass.ListObjects(“SELECT * FROM Win32_LogicalDisk WHERE DriveType=3”, mos, listView1);

 

 

//Sistemdeki Duran Servisleri listelemek

List<string> collection =newList<string>();

ManagementObjectSearcher searcher =

    newManagementObjectSearcher(“SELECT * FROM Win32_Service WHERE State=’Paused'”);

foreach(ManagementObject obj in searcher.Get())

{

        collection.Add(obj[“DisplayName”].ToString());

}

Reklamlar

Haziran 12, 2010 Posted by | C# | , , , | Yorum bırakın

Instrumentation (Event Loglar ve Performans Logları)

Bu yazımızda .NET Framework ile windowsun event loglarına nasıl kayıt atabiliriz bunları nasıl gösterebiliriz ,uygulamızın performansını nasıl gözlemleyebiliriz , Debug ve Trace olaylarını incelemeye çalışacağız.

 

Event Loglar
Uygulamamız deploy ettikten sonra uygulamanın nerelerde hata verdiği , müşterinin ne kadar RAM harcadığı veya nezaman out of memory verdiğini bilmek mutlaka gerekmektedir.Her ne kadar bütün testleri yapılmış bir uygulamada olsa mutlaka beklenmedik hatalar çıkacaktır. Müşteriler birer developer olmadıkları için karşılaştıkları hataları da developerlara düzgün bir şekilde aktaramayabilirler.Bu yüzden developer Event Loglara bakarak müşterinin karşılaştığı hatayı analiz edebilir.Ancak gerekli olmadıkça kullanmamakta fayda vardır.

 

.NET Framework te Event Logları kullanabilmek için System.Diagnostics namespace’i kullanılır.

//Event Loga kayıt girmek

EventLog logger = newEventLog(“DemoApp”);

logger.Source = “DemoApp”;

logger.WriteEntry(“Butona Tıklandı.”, EventLogEntryType.Information);

 

 

 

 

//Event Logu Silmek

EventLog.Delete(“DemoApp”);

 

EventLog logger = newEventLog(“Security”);

logger.Source = “DemoAppSource”;

logger.WriteEntry(“173.123.33 IP si sql injection yolladı”, EventLogEntryType.Warning);

 

 

//Event Logdan entry okumak

EventLog logger = newEventLog();

logger.Log = “Application”;

foreach (EventLogEntry item in logger.Entries)

{

    listBox1.Items.Add(item.Source+” : “+item.Message);

}

 

Debug ve Trace
Bir programcının büyük çoğunluğu aslına bakarsak kod yazmak değil yazılan kodu debug etmekle geçmektedir.Bu yüzden bu konu önemli bir konudur.Debug toollarını verimli kullanmak kaliteli kod yazmaya da yardımcı olur.

.NET Framework içerisindeki Debugger sınıfı Debugger uygulaması ile iletişime geçmeye yardımcı olur.Bu sınıfın metodları ; Break,IsAttached,IsLogging,Launch,Log ‘dur.

Aşağıdaki kod ile eğer mesaj null ise uygulama breakpointe düşer. Bu komutlar sadece Debug modda çalışır eğer Release modda ise çalışmaz.

string mesaj = null;

if (mesaj == null) Debugger.Break();

 

Aşağıdaki kod ile yeni bir listener nesnesi yaratılıp output windowda görüntülenmek üzere log yazılır.

Trace.Listeners.Clear();

DefaultTraceListener myListener = newDefaultTraceListener();

Trace.Listeners.Add(myListener);

Debugger.Log(2, “TEST”, “This is test for Log”);

 

Debugger sınıfı oldukça kullanışlı ancak Debug sınıfı çok daha özel fonksiyonlara sahip ; Assert,Close,Fail,Flush,Indent,Print,Unindent,Write,WriteId,WriteLine,WriteLineId .

 

Debug.Assert metodunu bir case doğru olmadığı zaman breakpointe düşsün diyebilmek için kullanılır.
NameValueCollection mySettings = ConfigurationManager.AppSettings;

Debug.Assert(mySettings != null && mySettings[“KEY1”] != null, Hata var!!!!!”);

Debug.WriteIf(mySettings == null, “Hata”);

Debug.Write(“————————–“);

Debug.Flush();

 

Debug Attribute’lar : Kendi oluşturduğumuz alanların debug modda görünür veya görünmez yapabiliriz. Aşağıdaki sınıfta sadece companyState görünür diğerleri görünmez olarak set edilmiştir.Ayrıca sınıfın nesnesinin üzerine geldiğimizde değerlerin nasıl görüneceğini de DebuggerDisplay ile belirleyebiliriz.

[DebuggerDisplay(“Name={_companyName},State={_companyState},City={_companyCity}”)]
publicclassCompany

{

        [DebuggerBrowsable(DebuggerBrowsableState.Never)]

        string _companyName;

 

        [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)]

        string _companyState;

 

        [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]

        string _companyCity;

 

        public Company(string companyName,string companyState,string companyCity)

        {

            _companyName = companyName;

            _companyState = companyState;

            _companyCity = companyCity;

        }

}

 

Trace sınıfı : Debug sınıfına benzer şekilde Trace de bir listener nesnesi VS’a attach edildiği zaman çalışır.VS build-in listener nesneleri içerir bunlar;

 

XMLTraceListener,DefaultTraceListener,DelimmedListTraceListener ve EventLogTracelistener ‘dır

 

 Metodları ; AutoFlush,Close,Fail,Flush,Indent,IndentLevel,IndentSize,Listeners,Refresh,TraceInformation,TraceWarning,Unindent,UseGlobalLock,Write,WriteIf,WriteLine,WriteLineIf.

Monitor Performans :

Bazen normal bir bugı bulmak performans sorununu çözmekten çok daha kolay olabilir. Tipik performans sorunlarını aşağıdaki şekillerde oluşabilir.

–        UI ekran kilitlenmeleri

–        Yavaş ağ bağlantısı

–        Yavaş db erişimi

–        Yavaş dosyaya yazma ve okuma

Örneğin bir web uygulamanız var ve müşterilerden yavaşlık şikayetleri alıyorsunuz bu durumda müşterilerinize veya patronunuza ne cevap verirsiniz. İşte bu gibi durumlarda yavaşlık probleminin kaynağını bulabilmek için .NET içerisinde System.Diagnostic namespace’ine ait sınıfları kullanabilirsiniz.

Ancak performans konusuna geçmeden önce Process nedir ondan bahsetmek gerekir. Process’ler bir kaynak içeren memory alanı olarak tanımlanabilir. Process’ler birleşerek ise uygulamayı meydana getirir. Bir bilgisayarın RAM’i ne kadar fazla ise uygulamaları o kadar etkin çalıştırabilir.

//Calisan Processi almak

Process p1 = Process.GetCurrentProcess();

MessageBox.Show(p1.ToString());

//Bir processi id si ile almak

Process p2 = Process.GetProcessById(2);

MessageBox.Show(p2.ProcessName);

 

//Butun processleri listelemek

Process[] list = Process.GetProcesses();

for (int i = 0; i < list.Length; i++)

{

    listBox2.Items.Add(list[i].ProcessName);

}

 

 

Performance Counter : sisteminiz üzerinde çalışan tüm process leri, cpu kullanımını, memory kullanımını, sql server durumu, IIS durumu, services ve administrative tools option larını kontrol edebileceğiniz ve anlık verilerini alabileceğiniz bir .NEY bileşenidir. Microsoft Windows Task Manager da görebileceğiniz tüm sistem istatistiklerine bu bileşen sayesinde ulaşabilirsiniz.
Bileşeni kullanmak için projenize System.Diagnostics NameSpace ini dahil etmeniz gerekiyor.
CategoryName
Performans verilerini almak istediğiniz kategori seçimini bu alanda yapıyoruz. Burada kullanabileceğiniz başlıca değerler:
– ASP.Net
– ASP.Net Applications
– Browser
– Cache
– Process
– Processor
– SQL Server
– Server
– Thread
– System
– Telephony
– WMI Objects
– vs

CounterName
Bir üstteki kategoriden seçtiğiniz item ın alt kategorileri yani kullanabileceğiniz counter tipleri karşınıza çıkacaktır. Örneğin üst menüden Telephonyi seçtiğimizi varsayarsak karşınıza çıkacak kullanılabilir counter listesi şu şekilde olacaktır:
– Active Lines
– Active Telephones
– Client Apps
– Current Incoming Calls
– Current Outgoing Calls
– Incoming Calls/sec
– Lines
– Outgoing Calls/sec
– Telephone Devices

//Harici bir process i çalıştırmak.

ProcessStartInfo p = newProcessStartInfo();

p.FileName = @”c:denem.exe”;
Process.Start(p);

StackTrace : sınıfı .NET Framework uygulamasının belirtilen zamandaki runtimeda call stack durumunu göstermeyi sağlar.
try

{

    int x = 1;

    x–;

    int i = 10 / x;

}

catch(DivideByZeroException ex)

{

    //Hangi dosya içerisinde hangi satırda hata aldığını gösterir.

    MessageBox.Show(ex.StackTrace);

Haziran 11, 2010 Posted by | C# | , , , , | Yorum bırakın

MCTS – Configuration Files

Bir kurulumda uygulamayı kullanıcı ihtiyaçlarına göre yüklemek , deneme sürümü olarak kullanıcıların kullanabilmesini sağlamak günümüzde oldukça önemli bir yere sahiptir. Kurulumun kolay,hızlı ve ihtiyaca uygun olması gerekir.

Hard-coding yapmayı engellemek için run-time da değişebileceğini tahmin ettiğimiz değerleri  konfigurasyon dosyasının bir parçası olan application settings dosyasına yapmalıyız.

System.Configuration namespace’i konfigürasyonu yönetmemiz için geliştirilmiş bir kütüphanedir.

//Mevcut exenin config dosyasını açmak

Configuration cs1 = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

//Bilgisayarın machine.config dosyasını açmak

Configuration cs2 = ConfigurationManager.OpenMachineConfiguration();

 

//Belli bir path deki config dosyasını açmak

ExeConfigurationFileMap myMap = newExeConfigurationFileMap();

myMap.ExeConfigFilename = @”ileriWindowsForms.exe.config”;

Configuration cs3 = ConfigurationManager.OpenMappedExeConfiguration(myMap, ConfigurationUserLevel.None);

//Bütün cs ler mantık olarak aynı şeyi yapar. Konfigurasyon dosyasının değerlerini nesneye dönüştürür.

 

Uygulamanın genel ayarları bu config dosyasında tutulabilir.Configuration tagı altında bu ayarlar yapılabilir.Örneğin uygulamanın kullandığı .NET Framework versiyonu bu dosyada belirlenebilir. Uygulamanın .NET 1.1 ile çalışmasını garanti etmek için aşağıdaki gibi bir yapılandırma ayarı yapmamız gerekir.Eğer bunu yapmazsak default olarak sistemde yüklü olan en son versiyon ile çalışır.
<startup>

<supportedRuntime version=v1.1.4322/>

startup>

Diğer genel bir konfigurasyon ayarı ise bir shared assembly kullanımı ve assembly’i GAC a yüklemektir. Bunu da   developmentMode tagı ile yapıyoruz.
<runtime>

<developmentMode developerInstallation=true/>

runtime>

 

Bir dll’in bir versiyonunu runtime’da yüklemek için aşağaki tagları kullanabiliriz.

<runtime>

<assemblyBinding xmlns=schemaname>

<dependentAssembly>

<assemblyIdendity name=myprogram publicKeyToken=xxxxxxxxx culture=en-us/>

<codeBase version=x.0.0.0 href=http://koraykirdinli.blogcu.com/aa.dll/>

dependentAssembly>

assemblyBinding>

runtime>

AppSettings tagları arasına uygulama ile ilgili spesifik ayarlar , ConnectionStrings taglarının arasına ise veritabanı bağlantı stringleri eklenir. AppSettings bir NameValue collection’dır fakat ConnectionStrings ConnectionStringSettingsCollection’dır.

//Tum AppSettings i okumak

NameValueCollection AllAppSettings = ConfigurationManager.AppSettings;

Int32 Counter = 0;

IEnumerator SettingsEnumerator = AllAppSettings.Keys.GetEnumerator();

while (SettingsEnumerator.MoveNext())

{

Console.WriteLine(“Item {0}Value {1}”,AllAppSettings.Keys[Counter],AllAppSettings[Counter]);

}

 

Application setting lerde bir web servisin URL bilgisi, remooting ayarları, vs gibi bilgiler tutulabilir.Bunları elle yazabileceğimiz gibi projeye bir settings dosyası ekleyip bu değişkenleri buradan ekleyebiliriz. Daha sonra proje build olduğunda bu değişkenler için bir sınıfı .NET bizim adımıza eklemiş olur.

[global::System.Configuration.UserScopedSettingAttribute()]

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

[global::System.Configuration.DefaultSettingValueAttribute(http://koray.com&#8221;)]

publicstring WebServiceURL {

    get {

        return ((string)(this[“WebServiceURL”]));

    }

    set {

        this[“WebServiceURL”] = value;

    }

}

//Aşağıdaki şekilde setting lere erişlebilir.

Settings1 s = newSettings1();

s.WebServiceURL;

 

Özellikler remooting yaparken dll leri client makinada değil daha güçlü server makinada çalıştırarak performans kazanabiliriz. Aşağıdaki konfigurasyon ayarı servera componenti register eder.
  <system.runtime.remoting>

<service>

<wellknown type=FullyQualifiedName,AssemblyName mode=Singleton objectUri=MyClass.rem/>

service>

system.runtime.remoting>

 

.NET Framework Configuration Tool :
Bu araç ile GAC,assembly’leri ve kod erişim yetkilerini yönetebiliriz. Ayrıca remoote servisleri ayarlayıp uygulamaları yönetebiliriz.

 

 

 

 

 

Installer

 

.NET Framework içerisinde uygulamaları kullanıcıya özel olarak yükletebilmek için Install sınıfını kullanırız.
Installerlar ne işe yarar.

–        Uygulamaya profosyonel bir görünüm kazandırır

–        Kullanıcının basit bir şekilde uygulamanın istediği özelliklerini yüklemesini sağlar.

–        Silme işlemi yaptırılır.

–        Özel ayarların yapılabilmesini sağlar(Web servis URLsi veya server adı gibi.

 

 Bu sınıf base sınıftır ve AssemblyInstaller ve ComponentInstaller olmak üzere 2 alt sınıfı mevcuttur.

Bir installer yaratmak için şu adımları takip etmeliyiz.

–        Bir installer sınıfı yaratırız.

–        Install,Commit,Rollback,Uninstall sınıflarını override ederiz.

–        [RunInstallerAttribbute=true] olarak set edilir.

InstalUtil.exe gibi bir program ile installer invoke edilir.

Haziran 1, 2010 Posted by | C# | , , | Yorum bırakın