Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

C # na Linux - Mono ľahko a rýchlo

My tým Javystům eště ukážeme, ako je náš C# multiplatformový : P

Vytvoríme nový projekt, na ktorom si vyskúšame:

  • Vykreslenie WinForms a komponentov
  • Zápis / čítanie do súboru
  • Zistíme, na ktorom systéme náš program beží

Pridáme si Label na ktorý si bude vypisovať, na ktoré platformovým aplikácia beží.

Ďalej potom TextBox, ktorému nastavíme MultiLine, AcceptsReturn a AcceptsTab. Bude slúžiť na písanie, textu, ktorý sa bude ukladať.

A ešte Button, ktorý zobrazí napríklad MessageBox

Teraz pridáme tlačidlu udalosť OnClick. A Formu pridáme udalosť FormClosing.

Vytvoríme si súbor AppFunctions a doň pridáme dve triedy.

public static class IOFunctions
{

}

public static class Platform
{

}

Do IOFunctions pridáme cestu k priečinku, kam sa budú dáta ukladať. Ako oddeľovač je použité Path.DirectorySeparatorChar čo je prvá dôležitá informácia. Ak budete niečo čítať zo zložiek pri programe alebo zapisovať. V Linuxe je / vo Windows \. Path.DirectorySeparatorChar nám vráti oddeľovač, podľa platformy, na ktorej program beží.

private static string AppDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + Path.DirectorySeparatorChar + Application.ProductName + Path.DirectorySeparatorChar;

Ďalej pridáme jednoduchú metódu na zápis do súboru:

public static void WriteToFile(string FileName, string Text)
{
    using (StreamWriter sw = new StreamWriter(AppDataFolder + FileName, false, Encoding.Unicode))
    {
        sw.Write(Text);
    }
}

Mono automaticky vytvorí všetky súbory v priečinku používateľa pre daný OS.

Kontrolu či súbor a zložka existujú:

public static bool FileExists(string FileName)
{
    if (!Directory.Exists(AppDataFolder))
        Directory.CreateDirectory(AppDataFolder);

    return (File.Exists(AppDataFolder + FileName));
}

A čítanie:

public static string ReadFromFile(string FileName)
{
    if (!FileExists(FileName)) return "";

    using (StreamReader sr = new StreamReader(AppDataFolder + FileName, Encoding.Unicode))
    {
        return sr.ReadToEnd();
    }
}

V udalosti Closing Form zavoláme zápis do súboru s parametrom TextBox.Text.

IOFunctions.WriteToFile("myTextBoxText.txt", myTextBox.Text);

Do konstruktoru formu potom čítanie:

myTextBox.Text = IOFunctions.ReadFromFile("myTextBoxText.txt");

Teraz sa budeme venovať triede Platform

Vytvoríme si vlastný dátový typ Platforms

public enum Platforms { Windows, Linux, Mac }

A metódu, ktorá nám ho vráti, podľa toho na ktorej platformovým program beží:

public static Platforms GetCurrentPlatform()
{
    if (Environment.OSVersion.Platform == PlatformID.Unix)
            {
                if (Directory.Exists("/Applications")
                    & Directory.Exists("/System")
                    & Directory.Exists("/Users")
                    & Directory.Exists("/Volumes"))
                    return Platforms.Mac;
                else
                    return Platforms.Linux;
            }
    else if (Environment.OSVersion.Platform == PlatformID.MacOSX)
        return Platforms.Mac;
    else
        return Platforms.Windows;
}

Niektoré verzie MacOS sa javí ako Linux. Ovšem Mac má špecifické zložky, podľa ktorých ho možno rozpoznať.

Tlačidlu pridáme konečne ten dialóg:

MessageBox.Show("Zdravím Tě, uživateli " + Platform.GetCurrentPlatform().ToString());

A Label priradíme:

SystemPlatform.Text = Platform.GetCurrentPlatform().ToString();

Teraz, keď budete chcieť niečo opodmínkovat:

if (Platform.GetCurrentPlatform() == Platforms.Linux)
    // linuxák
else if (Platform.GetCurrentPlatform() == Platforms.Windows)
    // windowsák

A teraz, keď už máme jednoduchý program, ho rozbehneme na všetkých spomenutých patformách.

Na systémoch založených na Unixe treba Mono - www.mono-project.com Balíčky: mono-complete a libgdiplus

  • Mono emulácie .NET programu.
  • Libgdiplus zabezpečuje prácu s WinForms.

Všetky podrobnejšie info nájdete na stránkach www.mono-project.com

Pokiaľ chcete vyvýjať na Linuxe v C# existuje MonoDevelop - http://monodevelop.com/

Existuje migračnej analyzátor, ktorý vám, povie, čo treba pošéfit, aby aplikácia bezproblémov bežala: http://www.mono-project.com/Moma

Dôležité je brať zreteľ najmä na zložkový oddeľovač a používať teda Path.DirectorySeparatorChar ďalej potom pri zápise do súboru neopomenúť, že vo Windows sa používa pre nový riadok "\ r \ n" v Linuxe "\ n" a v MacOS "\ r" preto použiť: Environment.NewLine atp.

Ohľadom Fontov (Písem) Mono je automaticky mení. Čo nie je vždy žiadané a zatiaľ som neprišiel na to, ako použiť vlastné. Napríklad v RichTextBoxu som sa stretol s problémom, že kazí kódovanie v Rtf formáte a pridáva nové riadky. Akonáhle budem vedieť čo s tým, článok aktualizujem. Prípadne, keby mal niekto skúsenosť, budem rád :)

V termináli by malo stačiť nasledujúce (Ubuntu)

sudo apt-get install mono-devel
# možná půjde i `mono-complete`
sudo apt-get install libgdiplus

Potom si len nabehnete program

mono MujProgram.exe

Do terminálu sa vypisujú všetky výstupy zapísané pomocou Console.Write a tiež výnimky.

Nezaujímavý obrázok:
"C # - Pre pokročilých ":http://www.itnetwork.cz/…dows-all.png

Aplikácie v openSUSE:
"C # - Pre pokročilých ":http://www.itnetwork.cz/…suse-all.png

Aplikácia vo Fedore
"C # - Pre pokročilých ":http://www.itnetwork.cz/…dora-all.png

Aplikácia na Ubuntu
"C # - Pre pokročilých ":http://www.itnetwork.cz/…untu-all.png

Aplikácia na MacOS X
"C # - Pre pokročilých ":http://www.itnetwork.cz/…acos-all.png

Od teraz sa už môžete v kolónke kompatibilita rozpísať :)


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 388x (45.63 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Všetky články v sekcii
C # - Pre pokročilých
Článok pre vás napísal David Jančík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity