C# na Linux - Mono snadno a rychle

C# .NET Pro pokročilé 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:

Aplikace v OpenSuse:

Aplikace ve Fedoře

Aplikace na Ubuntu

Aplikace na MacOS X

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


 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (6 hlasů) :
4.333334.333334.333334.33333 4.33333


 



 

 

Komentáře
Zobrazit starší komentáře (9)

Avatar
mkub
Redaktor
Avatar
mkub:

suhlasim... a v mobilnych aplikaciach Java si este udrzi svoje miestocko

 
Odpovědět 25.1.2014 9:51
Avatar
Benjibs
Člen
Avatar
Benjibs:

Flamovat, kde? :O

Ak to berieš ako flame, tak si to zrejme pochopil zle,
hovoril si, že C# je multiplatformný jazyk, čo môže byť pravda,
a ja som len k veci podotkol, že podľa môjho názoru sa nerozšíri tak ako Java, čo som aj patrične odôvodnil.

Ak to vyznelo, že mi o hádku/rýpanie, tak sa ospravedlnujem.

Odpovědět  +1 25.1.2014 9:53
1 + 1 = 2
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Benjibs
David Čápka:

Flame to je, protože co říkáš nemá žádnou logiku. Ať chceš nebo ne, Java je komerční technologie, vyvíjená komerční firmou. Pokud na ní hceš něco vážného stavět, budeš platit a to hodně za server, protože ty kvalitní jsou placené. Stejně tak budeš platit za DB oracle atd. Že jsou freeware alternativy je sice hezké, ale to je dobré tak možná na menší projekty. MS má free alternativy úplně stejně. A cena těch licencí je stejně dost malá položka v rozpočtu zakázek takových rozměrů.

Odpovědět  ±0 25.1.2014 9:56
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovědět  +1 25.1.2014 10:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Odpovídá na David Čápka
Benjibs:

Ak na Jave už beží každá mikrovlnka, toastovač a neviem čo,
prečo by sa výrobcovia zo dňa na deň rozhodli zmeniť technológiu a prejsť napr. na C#?

Na to by musel byť nejaký sakramentsky dobrý dôvod..
A kedže tie jazyky sa vlastne až tak nelíšia,
preto logicky predpokladám, že na tom poli ostane Java určite nejakú tu dobu víťazom.

Odpovědět  +1 25.1.2014 10:03
1 + 1 = 2
Avatar
mkub
Redaktor
Avatar
Odpovídá na David Čápka
mkub:

radsej ta nebudem komentovat, lebo to by bolo odbocenie od temy a moznost dalsieho flame...
ale len pripomeniem, ze nie vzdy, za co treba platit je aj skutocne kvalitne

 
Odpovědět  +1 25.1.2014 10:09
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Benjibs
David Čápka:

Aha, takže tvé předpoklady jsou založené na tom, že je Java v mikrovlnkách. Kdyby se MS vyplatilo vyvíjet platformu pro mikrovlnky, tak by to dělal. Peníze se točí jinde a Java i C# jsou financovány firmami jako banky, státní instituce a podobně. Když ti při hodinovém výpadku DB dojde ke ztrátě pár set tisíc Kč nebo dokonce milionů, určitě nebudeš šetřit pár desítek tisíc za server. To je již druhá odpověď na tvé nesmyslné tvrzení, že se C# nepoužívá, když jsou nekomerční alternativy. To zajímá tak možná tebe.

Odpovědět  ±0 25.1.2014 10:09
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na mkub
David Čápka:

Samozřejmě, s tím naprosto souhlasím. Ale ty by sis vzal na triko takové riziko? Radši zaplatíš firmě, která má tohle know how než použiješ komunitní projekt, který by teoreticky měl fungovat stejně. Jde o další věci, support, výkon... Zaplatíš a to jak za Javu tak za C#. Tyhle diskuze lidí co si myslí že Java existuje proto aby byla v toustovači nebo aby v ní bylo freeware IDE jsou fakt nesmyslné.

Editováno 25.1.2014 10:13
Odpovědět  +1 25.1.2014 10:12
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Databáze PosgreSQL je lepší než Oracle. PostgreSQL je zdarma, Oracle za těžké peníze. Přesto se v komerčních aplikacích nasazuje Oracle a to kvůli zárukám dodavatele.

Odpovědět 25.1.2014 10:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
mkub
Redaktor
Avatar
Odpovídá na David Čápka
mkub:

@sdraco: keby som mal banku, ci firmu, je jeasne, ze si zaplatim firmu s know-how a za support, a zaroven by som si vyberal firmu, ktora ma lepsiu podporu za jednotku ceny (cize ma lepsi pomer cena/moznosti)
a co sa tyka C# vs. Java, tak to som uz vyssie spomenul, povodne nebol multiplatformovy, ale vdaka firme Novell sa nim stal a Java uz pri svojom navrhu vznikala ako multiplatformova zalezitost

@Ja: v tvojom vyssom prispevku si napisal: "Java ajtak nikdy nedosiahne..." tam je uz citit zaciatok flamu

 
Odpovědět  +2 25.1.2014 10:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 19. Zobrazit vše