C# na Linux - Mono snadno a rychle
My těm Javystům eště ukážeme, jak je náš C# multiplatformní
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.
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ů