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 snadno a rychle

My těm Javystům eště ukážeme, jak je náš C# multiplatformní :P

Vytvoříme nový projekt, na kterém si vyzkoušíme:

  • Vykreslení WinForms a komponent
  • Zápis/čtení do souboru
  • Zjistíme, na kterém systému náš program běží

Přidáme si Label na který si bude vypisovat, na které platformně aplikace běží.

Dále pak TextBox, kterému nastavíme MultiLine, AcceptsReturn a AcceptsTab. Bude sloužit k psaní, textu, který se bude ukládat.

A ještě Button, který zobrazí například MessageBox

Nyní přidáme tlačítku událost OnClick. A Formu přidáme událost FormClosing.

Vytvoříme si soubor AppFunctions a do něj přidáme dvě třídy.

public static class IOFunctions
{

}

public static class Platform
{

}

Do IOFunctions přidáme cestu ke složce, kam se budou data ukládat. Jako oddělovač je použito Path.DirectorySeparatorChar což je první důležitá informace. Pokud budete něco číst ze složek u programu nebo zapisovat. V Linuxu je / ve Windows \. Path.DirectorySeparatorChar nám vrátí oddělovač, dle platformy, na které program běží.

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

Dále přidáme jednoduchou metodu na zápis do souboru:

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

Mono automaticky vytvoří veškeré soubory ve složce uživatele pro daný OS.

Kontrolu zda soubor a složka existují:

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

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

A čtení:

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

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

V události Closing Form zavoláme zápis do souboru s parametrem TextBox.Text.

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

Do konstruktoru formu pak čtení:

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

Nyní se budeme věnovat třídě Platform

Vytvoříme si vlastní datový typ Platforms

public enum Platforms { Windows, Linux, Mac }

A metodu, která nám jej vrátí, podle toho na které platformně program běží:

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;
}

Některé verze MacOS se jeví jako Linux. Ovšem Mac má specifické složky, dle kterých jej lze rozpoznat.

Tlačítku přidáme konečně ten dialog:

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

A Labelu přiřadíme:

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

Nyní, když budete chtít něco opodmínkovat:

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

A teď, když již máme jednoduchý program, ho rozběhneme na všech zmínených patformách.

Na systémech založených na Unixu je třeba Mono - www.mono-project.com Balíčky: mono-complete a libgdiplus

  • Mono emulace .NET programu.
  • Libgdiplus zajišťuje práci s WinForms.

Veškeré podrobnější info najdete na stránkách www.mono-project.com

Pokud chcete vyvýjet na Linuxu v C# existuje MonoDevelop - http://monodevelop.com/

Existuje migrační analyzátor, který vám, řekne, co je třeba pošéfit, aby aplikace bezproblémů běžela: http://www.mono-project.com/Moma

Důležité je brát zřetel zejména na složkový oddělovač a používat tedy Path.DirectorySeparatorChar dále pak při zápisu do souboru neopomenout, že ve Windows se používá pro nový řádek "\r\n" v Linuxech "\n" a v MacOS "\r" proto použít: Environment.NewLine atp.

Ohledně Fontů (Písem) Mono je automaticky mění. Což není vždy žádané a zatím jsem nepřišel na to, jak použít vlastní. Například v RichTextBoxu jsem se setkal s problémem, že kazí kódování v Rtf formátu a přidává nové řádky. Jakmile budu vědět co s tím, článek aktualizuji. Případně, kdyby měl někdo zkušenost, budu rád :)

V terminálu by mělo stačit následující (Ubuntu)

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

Poté si jen najedete program

mono MujProgram.exe

Do terminálu se vypisují veškeré výstupy zapsané pomocí Console.Write a také vyjímky.

Nezajímavý obrázek:
Tipy, triky a návody

Aplikace v OpenSuse:
Tipy, triky a návody

Aplikace ve Fedoře
Tipy, triky a návody

Aplikace na Ubuntu
Tipy, triky a návody

Aplikace na MacOS X
Tipy, triky a návody

Od teď se již můžete v kolonce kompatibilita rozepsat :)


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 388x (45.63 kB)
Aplikace je včetně zdrojových kódů

 

Všechny články v sekci
Tipy, triky a návody
Článek pro vás napsal David Jančík
Avatar
Uživatelské hodnocení:
6 hlasů
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity