Open Source im professionellen Einsatz

Die Class-Library von Mono

Monokultur

,

Das Mono-Projekt ist die freie Antwort auf Microsofts .NET-Plattform. Dieser Artikel stellt grundlegende Klassen und Methoden der Framework Class Library vor und demonstriert, wie man mit C# bequem Dateien, Zeichenketten und Collections verarbeitet.

Zu Mono[1] ist in letzter Zeit schon viel gesagt und geschrieben worden, deshalb gibt es an dieser Stelle nur ein paar Eckdaten zum Aufwärmen. Das Projekt wurde von Miguel de Icaza und anderen Entwicklern vor einigen Jahren ins Leben gerufen. Mono ist die Open-Source-Implementierung des .NET-Framework für verschiedene Plattformen. Wie das Original basiert es auf der Common Language Infrastructure (CLI). Ähnlich wie Java besteht das Mono-Environment aus einem Compiler, einer Virtual Machine und Myriaden von API-Klassen. Noch liegt der Schwerpunkt des Compilers auf C# - das wird sich in absehbarer Zeit aber ändern.

Freie Spezifikation

Die Entscheidung, die ursprünglich proprietäre Sprache C# (von Microsoft) auch für Linux verfügbar zu machen, geht unter anderem auf Erfahrungen bei der Gnome-Entwicklung zurück und hat seinerzeit für erhebliche Kontroversen gesorgt. Das Ziel ist, in Zukunft unter Linux eine moderne, einfach benutzbare und zugleich leistungsfähige Sprache wie C++ zu haben, aber ohne deren Nachteile. Die Installation von Mono ist nicht schwer, für die meisten Distributionen gibt es fertige Binärpakete, siehe Kasten "Installation".

Die Framework Class Library (FCL), das mächtige API des Mono-Framework, ist eine Klassenbibliothek, wie es sie auch in Programmiersprachen wie Java, Python und C++ gibt. Bibliotheken dieser Größenordnung sind nicht auf Anhieb zu verstehen oder gar zu überschauen. Vielmehr muss man eine Menge Zeit investieren, da sie oft aus mehreren tausend Klassen bestehen. Am Anfang braucht der Anwender aber nicht jedes Detail der FCL zu kennen.

Mono bringt mit »monop« sogar ein eigenes Tool für die Navigation durch die Klassenbibliothek mit. Mit der Option »-c« und einem Klassennamen aufgerufen zeigt es die entsprechenden Unterklassen an, bei einer Methode deren Signatur, siehe Abbildung 1.

Der Beitrag stellt wichtige Basisklassen vor, die tatsächlich bei der täglichen Arbeit unentbehrlich sind, und zeigt anhand von Beispielen typische Anwendungsbereiche. So ist es recht einfach, mit der Klassenbibliothek Dateien zu lesen, zu schreiben oder anderweitig zu bearbeiten. Die Klassen zur Verarbeitung von Zeichenketten sind in diesem Zusammenhang ebenfalls wichtig. So genannte Collections (Datentypen für Sammlungen wie »ArrayList«, »Hashtables«) sind in jeder Programmiersprache von zentraler Bedeutung, um eine angemessene Datenrepräsentation zu gewährleisten.

Dateien verarbeiten

C# stellt für die Bearbeitung von Dateien eine Menge komfortabler Konstrukte bereit und macht die Arbeit damit fast zum Kinderspiel. In der Framework Class Library finden sich für diesen Zweck die passenden Klassen: »File«, »TextReader« und »TextWriter«. Wer damit anfängt, selbst C#-Sourcecode zu schreiben, findet einige Hinweise dazu im Kasten "C # editieren".

Installation

Überhaupt kein Problem ist die Installation für Anwender, die Suse-Linux oder Fedora einsetzen, denn dafür gibt es unter[2] schon passende Pakete. Wer als Fedora-Nutzer das entsprechende Repository einträgt, aktualisiert seine Mono-Pakete in Zukunft bequem über Yum, siehe[3]. Debian-Benutzer werden unter[4] fündig. Für andere Plattformen ist aber möglicherweise der Griff zum Compiler erforderlich.

Abbildung 1: Mit dem Befehl »monop -c« lässt sich der Namensraum der Klassenbibliothek erkunden. Hier listet das Kommandozeilenprogramm die Interfaces und Klassen des Namespace »System« auf.

Abbildung 1: Mit dem Befehl »monop -c« lässt sich der Namensraum der Klassenbibliothek erkunden. Hier listet das Kommandozeilenprogramm die Interfaces und Klassen des Namespace »System« auf.

Listing 1 zeigt das erste C#-Beispiel, das die Handhabung der erwähnten Klassen demonstriert. Im Gegensatz zu Java ist es C# übrigens egal, ob Klassen- und Dateiname identisch sind. Das Programm in Listing 1 lässt sich folgendermaßen übersetzen:

mcs -o FH.exe FileHandler.cs


Der Compiler »mcs« ist das Gegenstück zum »csc« unter Windows und erzeugt aus dem Quelltext die ausführbare Datei; wer will, kann auch einen anderen Namen wählen oder den »-o«-Schalter einfach weglassen.

Der Befehl »file«, auf das Endprodukt angewandt, sorgt für eine Überraschung:

file FH.exe
 FH.exe: MS Windows PE 32-bit Intel 
 80386 console executable

Listing 1: Umgang mit Dateien:
»FileHandler.cs«

01 using System;
02 using Con = System.Console;
03 using System.IO;
04 
05 public class FileHandler {
06 
07   public static void Main(string [] args) {
08     string file = "";
09 
10     try {
11       file = args[0];
12     } catch (System.IndexOutOfRangeException) {
13       Con.WriteLine("Bitte Dateinamen angeben.");
14       Environment.Exit(1);
15     }
16 
17     if (File.Exists(file)) {
18       Con.WriteLine("Datei existiert: " + file);
19     } else {
20       using (TextWriter writer = File.CreateText(file)) {
21         writer.WriteLine("Hallo von Mono");
22       }
23     }
24     using (TextReader reader = File.OpenText(file)) {
25       Con.WriteLine("n" + reader.ReadToEnd());
26     }
27   }
28 }

Es ist kaum zu glauben, aber es gibt nun tatsächlich Exe-Dateien auch unter Linux. Dabei handelt es sich, wie bei den ebenfalls auftretenden DLLs, um so genannte Assemblies, die den ausführbaren Bytecode und Metainformationen enthalten.

Die kompilierte Datei führt man mit dem Aufruf »mono FH.exe« aus, der den Just-in-time-Compiler startet und dessen Endprodukt ausführt. Alternativ arbeitet der Interpreter »mint« die Exe-Datei ab. Mit dem Binfmt-Misc-Modul des Kernels lassen sich Mono-Bytecode-Dateien auch direkt ausführen, siehe Kasten "Direkt ausführen".

Im Code finden sich zwei Arten von »using«-Statements in unterschiedlichen Kontexten: am Anfang, um die Namensräume der Bibliothek verfügbar zu machen (Zeilen 1 bis 3), und dann noch zweimal in ganz anderer Weise weiter hinten im Listing (Zeilen 15 und 22).

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook