18 Ocak 2025 Cumartesi

Ubuntu'da CSharp Uygulaması Geliştirmek

 Merhaba, bu yazımda Ubuntu Linux sistemde C# program geliştirmeyi çalışacağım. Daha önceleri Windows uygulamaları geliştirmek için C# programlama dilini birçok kez kullandım. Ama şimdi yeni bir ihtiyaç doğdu, RaspberyPi benzeri bir sisteme ekran bağlayıp oluşturulan terminallerle veri toplamak. 

Amacımı gerçekleştirmek için daha önce duyduğum fakat hiç denemediğim Linux Mono kurulumu yaparak C# programlarımı Ubuntu sistem üzerinde çalıştırmayı deneyeceğim. Amacıma ulaşırken aynı programları hem Ubuntu hem de Windows üzerinde çalıştırarak her iki sistemde de çalıştığını görmek istiyorum.

Kurulumlarla başlayalım.



Ubuntu'da Mono Kurulumu

Denemelerimi yapmak için Windows üzerinde kurulan WSL Ubuntu sistemini kullanacağım. C# programları derlemek ve Ubuntu üzerinde çalıştırmak için Mono yazılımını kullanacağım. Sitede anlatıldığı gibi Mono yazılımını kurmak için Ubuntu terminalinde,

$ sudo apt install mono-devel

komutu girerek kurulumu yaparız. Kurulumu denemek için kısa bir program yazıp deneyelim. Yeni bir klasör oluşturup içine girelim 

$ mkdir cs
$ cd cs

Ben editör olarak VSCode kullanmayı tercih ediyorum hem Windows hem de Ubuntu üzerinde çalışan versiyonları var. Klasörümüzde VSCode çalıştırmak için terminalde 

$ code .

Komutunu çalıştıralım. Ubuntu'da VSCode uygulaması kurulu değilse de hemen gerçekleştirecek ve uygulamayı açacaktır. Editörümüzde yeni bir C# kod dosyası oluşturalım adı merhaba_konsol.cs olsun. İçine şu kodu yazalım (lütfen kopyalamayın, yazın).

using System;

public class Merhaba
{
    public static void Main(string[] args)
    {
        Console.WriteLine ("Merhaba Mono Dünyası");
    }
}

Koddan anlaşıldığı üzere bu bir .NET konsol uygulaması, bakalım çalışacak mı? 

Programımızı derlemek için teminalde 

$ mcs merhaba_konsol.cs

komutunu girelim, bazı sistemler de bu komut csc olarak çalışıyormuş, bilginiz olsun. Bu komutu girince programımız derlenir ve aynı klasör içinde merhaba_konsol.exe adında derlenmiş bir program oluşturulur. Şimdi çalıştırmak için terminalde şunu girelim.

$ # ./merhaba_konsol.exe

sonuçta terminalde şu çıktıyı verir

Merhaba Mono Dünyası

Eğer buraya ulaştıysak Mono uygulamasını Ubuntu sisteme başarıyla kurmuşuz demektir. Burada derlenen program Windows sisteminde de çalışır, test etmek için klasörü Windows gezgini ile bulup orada bir terminal açarak

> .\merhaba_konsol
Merhaba Mono Dünyası

şeklinde deneyebilirsiniz. Gördüğümüz gibi program her iki platformda da aynı şekilde çalışıyor. 

Şimdi aynı işlemleri Windows'ta da yapabilmek için terminalden C# programlarını derlemesini öğrenelim.



Windows'ta C# Programları Terminalde Derlemek

Windows'ta csc.exe dosyasının nerede olduğunu bulmanız gerekiyor. Sisteminizde .NET framework kuruluysa bu uygulama C:\Windows\Microsoft.NET\Framework ya da C:\Windows\Microsoft.NET\Framework64 klasörü altındaki kurulu her .NET versiyonu klasöründe o versiyona ait olmak üzere mevcuttur. 

Bendeki birçok versiyondan birini seçtim ve onu kullanmaya karar verdim. 

Öncelikle Ubuntu sistemle aynı kodları Windows sistemde de yazmak için bir klasör oluşturalım ve Windows gezgininde klasör içinde sağ tıklayıp Code ile Aç seçeneğini tıklayalım. VSCode editörü klasörümüzü açacaktır. Klasörde merhaba_konsol.cs adında kod dosyamızı oluşturalım ve içine kodumuzu yazalım.

using System;

public class Merhaba
{
    public static void Main(string[] args)
    {
        Console.WriteLine ("Merhaba Mono Dünyası");
    }
}

Şimdi csc.exe'lerimizden birisiyle derlemeyi deneyebiliriz. Ben csc.exe uygulamasını sistemimde 

C:\Windows\Microsoft.NET\Framework64\v4.0.30319

klasöründe buldum. Bunu kullanarak derleme yapmak için VSCode uygulamasındaki terminal penceresini de kullanabiliriz ya da klasörde bir terminal açabiliriz. Derlemek için terminalde şunu girelim:

> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe merhaba_konsol.cs

csc.exe'nin yerini tabi ki Windows gezgininin adres barından kopyaladım, tek tek yazmaya uğraşmadım. İsterseniz PATH sistem değişkenine bu klasörü ekleyip direk 

> csc.exe merhaba_konsol.cs

komutu da çalıştırabilirsiniz. Ancak bundan sonra sadece bu versiyon .NET derlemesini kullanacaksınız demektir. Hemen uygulamayı test edelim, terminalde şu komutu girelim.

> .\merhaba_konsol
Merhaba Mono Dünyası

Evet Windows'ta da aynı teknikle programımızı derledik. İsterseniz bu programın da çalışmasını Ubuntu sistemde deneyebilirsiniz. Bunun için ya .exe dosyayı Ubuntu terminalin olduğu klasöre kopyalayın ya da terminalde Windows klasörünüze geçiş yapın. Mesela ben klasöre geçip orada denedim.

$ cd ../../mnt/h/ujk_common/prg/c#/cs
/mnt/h/ujk_common/prg/c#/cs$ ./merhaba_konsol.exe
Merhaba Mono Dünyası

Evet aynen çalışıyor her iki sistemde derledik ve her iki sistemde de çalıştırdık. 

Şimdi konsol değil bir WPF GUI uygulaması yazalım bakalım ne olacak?



Ubuntu'da C# Windows Forms Uygulaması Geliştirmek

Editörümüzde merhaba_gui.cs adında yeni bir dosya üretelim ve içine şu kodu yazalım.

using System;
using System.Windows.Forms;

public class Merhaba : Form
{
    static public void Main ()
    {
        Application.Run (new Merhaba ());
    }

    public Merhaba ()
    {
        Text = "Merhaba Mono Dünyası";
    }
}

Bu kodu Ubuntu'da derlemek için terminalde şu kodu gireriz:

# mcs merhaba_gui.cs -r:System.Windows.Forms.dll

System harici kullanacağımız .NET kütüphanelerini belirtmemiz gerekiyor. Şimdi derlenmiş uygulamayı test için terminalde şu komutu girelim:

$ ./merhaba_gui.exe

Sonuçta ilk GUI uygulama penceremiz açılacaktır.

Yaşasın.. Şimdi aynı merhaba_gui.exe dosyasını Windows'ta da oluşturup deneyelim.

Windows'ta derlerken kütüphaneleri belirtmeye gerek yok direk 

csc.exe merhaba_gui.cs

komutu girerek programımızı derleyip .exe dosyamızı çalıştırabiliriz. Aynı sonucu verecektir. 

Aynı bilgisayarda çalıştığım için her iki sistemin ürettiği pencereyi bir arada görebiliyorum. Soldaki Ubuntu ve sağdaki Windows tarafından derlenen uygulama pencereleri. 

Bundan sonra biraz denemeler yapacağım. Devam eden satırlarda sadece Ubuntu kullanacağım ama isterseniz aynı şeyleri Windows ile de deneyebilirsiniz.



Ubuntu'da C# WinForms Gui Örnekleri

Önce boş bir pencere ile başlayalım. boş.cs adında bir kod dosyasına minimum uygulama amaçlı şu kodu girelim.

using System;
using System.Windows.Forms;

class Pencere : Form
{
    public Pencere(){

    }
    public static void Main(){
        Application.Run(new Pencere());
    }
}

Kodumuzu derler ve çalıştırırsak

# mcs boş.cs -r:System.Windows.Forms.dll
# ./boş.exe

sonuç

Koda kısaca bakarsak , sadece System ve System.Windows.Forms kütüphanelerini kullanıyoruz. Öncelikle System.Windows.Forms kütüphanesinin Form elemanından türetilmiş bir Pencere sınıfı tanımlıyoruz. Pencere sınıfının Main metodu içinde ise Application.Run() metodu ile uygulamamızı çalıştırıyoruz.

Pencere etiketinde bir yazı göstermek istiyoruz. Öncelikle dosyamızı etiketli.cs adıyla kaydedip, içine şu ilaveyi yapalım.

using System;
using System.Windows.Forms;

class Pencere : Form
{
    public Pencere(){
        this.Text = "Pencere Başlığı";
    }
    public static void Main(){
        Application.Run(new Pencere());
    }
}

çalıştırmak için

# mcs etiketli.cs -r:System.Windows.Forms.dll
# ./etiketli.exe

sonuç


public Pencere(){ } bloğu içine penceremizdeki elemanları ve özelliklerini yazarız. Burada yaptığımız ilavede this.Text özelliğine verdiğimiz değer penceremizin etiketinde görünecek yazıyı belirler.

Şimdi pencere boyutlarıyla oynayalım. Dosyamızı boyutlu.cs olarak kaydedip şu ilaveleri yapalım.

using System;
using System.Drawing;
using System.Windows.Forms;

class Pencere : Form
{
    public Pencere(){
        this.Text = "Pencere Başlığı";
        this.StartPosition = FormStartPosition.CenterScreen;
        this.ClientSize = new Size(400, 200); //etiket olmadan iç boyut
        this.MinimumSize = new Size(this.Bounds.Width, this.Bounds.Height);
        this.MaximizeBox = false;
    }
    public static void Main(){
        Application.Run(new Pencere());
    }
}

Öncelikle formun ekranın ortasında açılmasını sağlıyoruz. Sonra formun içindeki kullanım alanımızı 400x200 piksel olarak ayarlıyoruz. Sonra bu boyutun olabilecek en küçük boyut olacağını bildiriyoruz. this.Bounds özelliği bize kullandığımız işletim siteminin yazı fontları vs'ye göre oluşturduğu sonuç pencere boyutunu verir. MinimumSize özelliği toplam boyutun sınırlarını belirttiği için bu şekilde bir hesap kullandık. En son da Maximize butonunu pasif hale getirdik. Bunların sonucu penceremizin son halini görmek için derleyip çalıştıralım.

# mcs boyutlu.cs -r:System.Windows.Forms.dll -r:System.Drawing.dll
# ./boyutlu.exe


Şimdi sayfaya bir Label kontrolü ekleyip özelliklerini ayarlayalım. Öncelikle dosyamızı labelli.cs adıyla kaydedip şu ilaveleri yapalım.

using System;
using System.Drawing;
using System.Windows.Forms;
class Pencere : Form
{
Label label1;

    public Pencere(){
        label1 = new Label(){
            UseMnemonic = true, //& işareti harfin altını çizer
            Text = "Ön Adı : ",
            Location = new Point(15, 15),
            BackColor = Color.Pink,
            ForeColor = Color.Maroon,
            BorderStyle = BorderStyle.FixedSingle,
            TextAlign = ContentAlignment.MiddleLeft
        };
        label1.Size = new Size(label1.PreferredWidth, label1.PreferredHeight + 2);
        this.Text = "Pencere Başlığı";
        this.StartPosition = FormStartPosition.CenterScreen;
        this.ClientSize = new Size(400, 200); //etiket olmadan iç boyut
        this.MinimumSize = new Size(this.Bounds.Width, this.Bounds.Height);
        this.MaximizeBox = false;
        this.AutoScroll = true;
        this.Controls.Add(label1);
    }
    public static void Main(){
        Application.Run(new Pencere());
    }
}

label1 adını verdiğimiz bir Label kontrolü üretip bir sürü özelliğini giriyoruz. Sonra da this.Controls.Add(label1); satırı ile bu kotrolü penceremize ekliyoruz. Derleyip çalıştırırsak:

# mcs labelli.cs -r:System.Windows.Forms.dll -r:System.Drawing.dll
# ./labelli.exe


Şimdi forma tıklanınca bir mesaj penceresi açalım. Dosyamızı tıklanan.cs olarak kaydedelim.

using System;
using System.Drawing;
using System.Windows.Forms;
class Pencere : Form
{
Label label1;

    public Pencere(){
        label1 = new Label(){
            UseMnemonic = true, //& işareti harfin altını çizer
            Text = "Ön Adı : ",
            Location = new Point(15, 15),
            BackColor = Color.Pink,
            ForeColor = Color.Maroon,
            BorderStyle = BorderStyle.FixedSingle,
            TextAlign = ContentAlignment.MiddleLeft
        };
        label1.Size = new Size(label1.PreferredWidth, label1.PreferredHeight + 2);
        this.Text = "Pencere Başlığı";
        this.StartPosition = FormStartPosition.CenterScreen;
        this.ClientSize = new Size(400, 200); //etiket olmadan iç boyut
        this.MinimumSize = new Size(this.Bounds.Width, this.Bounds.Height);
        this.MaximizeBox = false;
        this.AutoScroll = true;
        this.Controls.Add(label1);
        this.Click += new EventHandler(tıklandı);
    }
    public void tıklandı(object ob, EventArgs e){
        MessageBox.Show("Form içerisine tıkladınız");
    }
    public static void Main(){
        Application.Run(new Pencere());
    }
}

ve çalıştırıp forma içinde biryere tıklayalım.

# mcs tıklanan.cs -r:System.Windows.Forms.dll -r:System.Drawing.dll
# ./tıklanan.exe

Mesaj penceresi etiketinde bir şey yazsın istersek tıklandı metodunu şöyle yazarız.

    public void tıklandı(object ob, EventArgs e){
        MessageBox.Show("Bu bildirim kapatılınca Form rengi değişecek",
            "Bilidirim Mesajı");
        this.BackColor = Color.Red;
    }

Burada mesaj penceresi kapatıldıktan sonra Form renginin değişmesini de sağladık.

Şimdi forma başka kontroller de ekleyelim. 

using System;
using System.Drawing;
using System.Windows.Forms;
class Pencere : Form
{
Label label1;
TextBox txt1;
Button btn1;
Button exit;

    public Pencere(){
        label1 = new Label(){
            UseMnemonic = true, //& işareti harfin altını çizer
            Text = "Ön Adı : ",
            Location = new Point(15, 15),
            BackColor = Color.Pink,
            ForeColor = Color.Maroon,
            BorderStyle = BorderStyle.FixedSingle,
            TextAlign = ContentAlignment.MiddleLeft
        };
        label1.Size = new Size(label1.PreferredWidth, label1.PreferredHeight + 2);
        txt1 = new TextBox(){
            Text = "Adınızı Giriniz",
            Location = new Point(15 + label1.PreferredWidth + 5, 15),
            BorderStyle = BorderStyle.FixedSingle,
            BackColor = Color.LightGray,
            ForeColor = Color.Maroon,
            Size = new Size(90, 20)
        };
        btn1 = new Button(){
            Text = "&OK",
            Location = new Point(15 + txt1.Location.X + txt1.Size.Width, 15),
            Size = new Size(50, 20)
        };
        btn1.Click += new EventHandler(Btn_tıklandı);
        exit = new Button(){
            Text = "Exit",
            Location = new Point(150, 150),
            Size = new Size(90, 20),
            BackColor = Color.Maroon,
            ForeColor = Color.White
        };
        exit.Click += new EventHandler(exit_tıklandı);
        this.Text = "Pencere Başlığı";
        this.StartPosition = FormStartPosition.CenterScreen;
        this.ClientSize = new Size(400, 200); //etiket olmadan iç boyut
        this.MinimumSize = new Size(this.Bounds.Width, this.Bounds.Height);
        this.MaximizeBox = false;
        this.AutoScroll = true;
        this.Controls.Add(label1);
        this.Controls.Add(txt1);
        this.Controls.Add(btn1);
        this.Controls.Add(exit);
        this.Click += new EventHandler(tıklandı);
    }
    public void tıklandı(object ob, EventArgs e){
        MessageBox.Show("Bu bildirim kapatılınca Form rengi değişecek",
            "Bilidirim Mesajı");
        this.BackColor = Color.Red;
    }
    public void Btn_tıklandı(object ob, EventArgs e){
        if(txt1.Text == "Adınızı Giriniz")
            MessageBox.Show("İsminizi Girmediniz!",
                "Bilidirim Mesajı");
        else
            MessageBox.Show("Merhaba!!! " + txt1.Text,
                "Bilidirim Mesajı");
    }    
    public void exit_tıklandı(object ob, EventArgs e){
        Application.Exit();
    }    
    public static void Main(){
        Application.Run(new Pencere());
    }
}

çalıştırırsak,

vesaire vesaire. Artık buradan yürürüz inşallah.














Hiç yorum yok:

Yorum Gönder