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:
"
":http://www.itnetwork.cz/…dows-all.png
Aplikácie v openSUSE:
"
":http://www.itnetwork.cz/…suse-all.png
Aplikácia vo Fedore
" ":http://www.itnetwork.cz/…dora-all.png
Aplikácia na Ubuntu
" ":http://www.itnetwork.cz/…untu-all.png
Aplikácia na MacOS X
" ":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#