C# Command-Line Argumanlarına Erişme


Biliyoruz ki defalarca yazdığımız ve kullanıdığımız Main() metodu args adında bir string dizisini parametre olarak almaktadır.  Öncelikle bu argumanlara nasıl ulaşır ve müdahale edebiliriz ona bir bakalım:
Main Metodu :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleCSharpApp
{
    class Program
    {
        static int Main(string[] args)
        {
        }
    }
}

1. Metod :

for (int i = 0; i < args.Length; i++)
  Console.WriteLine("Arg: {0}", args[i]);

2. Metod :

string[] theArgs = Environment.GetCommandLineArgs();
foreach (string arg in theArgs)
    Console.WriteLine("Arg: {0}", arg);

Program çıktısı :
image
Peki biz kendi argumanlarımızı projemize nasıl ekleriz? Bunun için projemize sağ tıklayıp Properties – > Debug içerisindeki Start Options –> Command line arguments içerisine istediğimiz arguman isimlerini başlarında “-” veya “/” olacak şekilde yazarak ekleyebiliriz.

image

Peki bu bizim nasıl işimize yarar? Mesela bir oyun yazdığımızı düşünelim ve bu projemizin argumanlarına örnekte olduğu gibi –godmode diye bir arguman tanımlarız. Eğer bir kişi bu argumanla bu programı çalıştırırsa bu kişinin hile yapan oyuncu olduğunu anlarız gibi çok basit bir örnek verebiliriz.

C# Main() Metodu ile ERRORLEVEL


Main metodunu C# ile yazdığımız tüm console, windows desktop ve windows servislerinde bulunması gerektiğiniz biliyoruz. Zaten bu programlardan herhangi birini yazmak için Visual Studio içinde yeni proje oluştruduğumuzda Visual Studio main metodu yazılmış şekilde projeyi oluşturmaktadır. Ve bu metod static bir metod olup void tipinde tanımlanmış olarak gelmektedir.

Fakat biz istersek bu metodun tipini değiştirebiliriz. Peki bu bizim ne işimize yarıyacak? Mesela bir örnek olarak ERRORLEVEL değişkenini batch dosyasıyla okuyarak programımızın döndürdüğü değeri izleyebiliriz. Windows üzerinde bir program çalıştırdığımızda Main() metodunun döndürdüğü değer ERRORLEVEL denilen çevresel değişken üzerinde tutulur. Genelde Main() metodunun döndürdüğü 0 programın sorunsuz çalıştığını –1 ise program çalışırken hata oluştuğunu göstermektedir. Yani kısacası Main() metodumuzun tipini void tipinden int tipine çevirerek programımızın doğru çalışıp çalışmadığını çevresel değişken olaran ERRORLEVEL’I kullanarak öğrenmek mümkün. Şimdi bu anlattıklarımızı bir program üzerinde inceleyelim.

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

namespace MainReturnValTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("C# Main() Metodu ile ERRORLEVEL");
            Console.ReadLine();
        }
    }
}

Yukarıda yazdığımız program default olarak gelen static void tipli Main() metodumuz ile yazdığımız program bu programı Main() metodunu int tipine çevirip yazarsak :

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

namespace MainReturnValTest
{
    class Program
    {
        static int Main()
        {
            Console.WriteLine("C# Main() Metodu ile ERRORLEVEL");
            Console.ReadLine();
            return 0;
        }
    }
}

Görüldüğü gibi artık Main metodu bir değer döndürüyor. Böylelikle artık çevresel değişken ERRORLEVEL’i kullanarak artık programımızın çalışmasını izleyebiliriz. Bunun için biz txt dosyası açarak aşagıdaki kodu içerisine kopyalayıp dosyayı test.bat şeklinde kaydedip projemizin olduğu klasöre kopyalamamız gerekli. Bundan sonra yapmamız gereken Visual Studio Commant prompt ile bat uzantılı dosyamızı bulup çalıştırmak.

rem test.bat
@echo off
MainReturnValTest
@if "%ERRORLEVEL%" == "0" goto good
:fail
echo Execution Failed
echo return value = %ERRORLEVEL%
goto end
:good
echo Execution succeeded
echo Return value = %ERRORLEVEL%
goto end
:end
echo All Done.


Çalışma sonucu :

image

C# Reflector Kullanımı

Daha önceki yazımızda bir programı derlediğimizde oluşan dll veya exe dosyasının CIL, metadata ve manifest bilgilerini içerdiğini ve bu bilgilere Visual Studio’nun bir tool’u olan idasm ile ulaşabileceğimizden bahsetmiştik. Bu yazıya buradan ulaşılabilir.
Reflector ise bu dll veya exe’yi kullanarak yazdığımız kodları göstermeye yarar. Yani elimizde bir dll veya exe var ise biz bu dll veya exe’nin oluşması için yazılan kodları görebiliriz. Şimdi bunu nasış yaptığını bir örnek ile inceleyelim
Not : Reflector Visual Studio içerisinde bulunan bir tool değildir. Buradan indirebilirsiniz.
Daha önce C# CIL, Metadata, Manifest Kavramları ve “ildasm.exe” yazımızda kullandığımız şu örnek üzerinden gidelim :

// Calc.cs
using System;

namespace CalculatorExample
{
    // This class contains the app's entry point.
    class Program
    {
        static void Main()
        {
            Calc c = new Calc();
            int ans = c.Add(10, 84);
            Console.WriteLine("10 + 84 is {0}.", ans);

            // Wait for user to press the Enter key before shutting down.
            Console.ReadLine(); 
        }
    }

    // The C# calculator.
    class Calc
    {
        public int Add(int x, int y)
        { return x + y; }
    }
}

Burada bir Program bide Calc sınıfımız var ve örnek olarak Calc sınıfımızın içerisine Add metodu eklemişiz. Bakalım bu programı derlememiz sonucu oluşan exe’yi Reflector’le açarak bu Add metodunun içeriğine ulaşabilecek miyiz? Bunun için önce yukarıda linkini verdiğim yerden Reflector’u bilgisayarınıza indirmeniz gerekmektedir. Program kurulum gerektirmemektedir. Zip dosyasını açıp içerisindeki “Reflector.exe”’yi çalıştırmanız yeterlidir. İlk çalışmada hangi Freamwork versiyonu ile çalıştığınızı soracaktır. Siz içeriğini açmak istediğiniz dll veya exe hangi versiyonda yazılmış ise onu seçerek programı başlatabilirsiniz. Benim yazdığım yukarıdaki program .NET 4.0’da derlendiği için ben 4.0’ı seçip çalıştırdım. Ardından File –> Open sekmelerini tıklayıp yazdığım programın derlenmesi sonucu oluşan Calc.exe’yi bularak açtım.

image

sonucunda gördüğünüz gibi Calc sınıfımın içerisine tanımladığım Add metodunun içeriğine ulaştım. Bu birlikte çalışılan projelerde eğer diğer takım arkadaşınız sizin yaptığınız değişikliği ezdiyse ve siz ne yaptığınızı hatırlamıyorsanız onu geri almak için mükemmel bir program oluyor. Yani hayat kurtarıyor. Bunun dışında elinizde bir dll veya exe var onun içeriğini merak ediyorsanız yine tam size göre bir program.

Ayrıca yazılan kodları sadece C# olarak getirmiyor. Aşağıdaki listeden seçtiğiniz programlama diline göre assembly içeriği getirtmek mümkün.

image
Örneğin Calc.exe’yi açarken C# değilde Visual Basic seçseydim sonuç şu şekilde olacaktı :

image

Yani Reflector için okuyacağı assembly’in hangi dilde yazıldığı önemli değil. Çünkü daha öncede dediğimiz gibi bu okuduğu assembly CIL bilgisi içeriyor. Yani platforma bağlı olmayan evrensel bir bilgi .NET tabanlı her dilin derlenmesi sonucu oluşan bir bilgi. Bu yüzden Reflector’da ona okuması için verdiğiniz assembly’in bu CIL bilgisini derlemenin tersine bir işlem yaparak size vermektedir. Derlenince yazdığımız kodlar nasıl CIL’e dönüşüyorsa Reflector ile de CIL yazılan koda dönüşüyor. Böyle bir program yaptıkları için Reflector yazıcılarına teşekkür etmek lazım sanırım.