Microsofts Dotnet-Plattform steht Linux-Programmierern über die Projekte Mono und DotGNU zur Verfügung. Der Artikel untersucht, wie weit sich die alternativen Implementierungen für Projekte in der Praxis eignen. Im Mittelpunkt steht die Programmierung grafischer Benutzeroberflächen.
Microsoft hat im Jahr 2002 mit Dotnet einen neuartigen Ansatz zur plattformunabhängigen Programmierung vorgestellt. Das Projekt soll die Entwicklung von Netzwerk- und Internet-Anwendungen vereinfachen. Es unterstützt objektorientierte Programmierung und wird mit einer einzigen Klassenbibliothek geliefert, die von mehreren Programmiersprachen wie zum Beispiel C# und VB-Dotnet nutzbar ist. Die Unterstützung der bisher favorisierten MFC-Bibliothek für Visual C++ hat die Firma im Zuge der Dotnet-Einführung eingestellt. Alle künftigen Microsoft-Produkte werden auf der neuen Technologie basieren.
Freies Dotnet?
Trotz des plattformunabhängigen Ansatzes wird Microsoft wohl nie eine Implementierung für Linux liefern. Dieser Aufgabe haben sich zwei Projekte angenommen: zum einen das von Novell gesponserte Mono-Projekt [1], das Linux-Magazin hat es in [2] bereits vorgestellt, zum anderen das Open-Source-Projekt DotGNU [3]. Beide Pakete streben eine möglichst komplette Implementierung der Dotnet-Plattform an, womit ein Software-Austausch über Betriebssystemgrenzen hinweg möglich wäre.
Neben Basisfunktionalitäten wie der String-Manipulation benötigen die meisten Projekte in der Praxis einige Elemente für grafische Benutzeroberflächen. Microsoft hat dafür die Bibliothek »System.Windows.Forms« vorgesehen, die GUI-Objekte wie »MainMenu«, »ToolBar«, »Combobox« oder »Button« zur Verfügung stellt. Listing 1 zeigt ein kleines Beispiel für ihre Benutzung.
Zum Vergleich der Implementierungen von Mono und DotGNU dient eine unter Windows geschriebene Applikation. Dieses kurze Beispiel enthält die wichtigsten GUI-Elemente, siehe Abbildung 1. Der Quellcode findet sich auf der Website des Linux-Magazins [4]. Die einzige Funktionalität besteht darin, die Benutzereingaben in einem dafür vorgesehenen Fenster zu protokollieren.
Das Original von Microsoft
Eine Möglichkeit, an das originale Microsoft Dotnet zu gelangen, ist der kostenlose Download der Dotnet-Laufzeitumgebung mit SDK (Software Development Kit). Sie enthält alle Kommandozeilen-Tools, die für die Software-Entwicklung unter Windows notwendig sind, ähnlich wie das Java-SDK. Der Befehl »csc« kompiliert eine Anwendung. Das Ergebnis ist unter Windows direkt ausführbar.
Als kommerzielle Alternative steht die integrierte Entwicklungsumgebung (IDE) Visual Studio Dotnet mit Debugger und Dialog-Editor zur Verfügung (Abbildung 2). Dieses Paket installiert das Dotnet-SDK automatisch mit. Eine hervorragende Alternative zum Visual-Studio-Dotnet-Paket ist die freie Entwicklungsumgebung Sharpdevelop (Abbildung 3, [5]). Dabei handelt sich um eine mächtige IDE, der lediglich ein integrierter Debugger fehlt. Zu den Features gehören beispielsweise die Möglichkeit, zwischen Microsoft- und Mono-Laufzeitumgebung umzuschalten sowie der Import von Visual-Studio-Dotnet-Projekten.
Die Alternative: Mono
Die Mono-Umgebung [6] gibt es sowohl für Linux als auch für Windows und Mac OS. Neben den Standard-Klassenbibliotheken von Dotnet bietet es eigene Erweiterungen wie diverse Gnome-Bibliotheken. Die virtuelle Maschine setzt Just-in-Time- und Ahead-of-Time-Kompiliertechniken zur Geschwindigkeitssteigerung ein. Für grafische Benutzeroberflächen setzt Mono auf GTK#, das ebenfalls für Windows verfügbar ist. GTK# setzt auf GTK+ auf und bildet unter Linux die Grundlage des Gnome-Desktops.

Abbildung 1: Die Demo-Anwendung enthält die wichtigsten GUI-Elemente der Dotnet-Bibliothek »System.Windows.Forms«. Hier die Windows-Version.
GUI mit »Windows.Forms«
Die Bibliothek »System.Windows.Forms« ist hauptsächlich in C# implementiert und zeichnet Steuerelemente selbst [7]. Sie benötigt auf jedem Betriebssystem einen Treiber, der zurzeit für X11 und Windows erhältlich ist. Dieses Konzept hat das DotGNU-Projekt übernommen, nachdem sich eine auf Wine basierende Implementierung als nicht praktikabel erwiesen hatte.

Abbildung 2: Visual Studio Dotnet zeigt Code des Beispielprojekts, hier zum Zeichnen grafischer Elemente.
Neben dem Compiler »mcs« und der Laufzeitumgebung »mono« steht unter Linux noch die Entwicklungsumgebung »monodevelop« zur Verfügung. Sie basiert auf einem Linux-Port von Sharpdevelop. Sehr praktisch ist auch der Hilfe-Browser »monodoc«, der dem Programmierer Online-Updates der Dokumentation im Mono-Repository erlaubt. Neben distributionsspezifischen Binärpaketen gibt es einen ausführbaren Installer, der alle benötigten Pakete einrichtet.
Nach dem Download des ungefähr 50 MByte großen Pakets führt ein Assistent mit wenigen Schritten durch die Installationsprozedur. Dank des Wizard gehören die Installationsprobleme, die bei nicht aktuellen, aber ausdrücklich unterstützten Distributionen aufgetreten sind, der Vergangenheit an, zum Beispiel jene mit Fedora Core 2. Außerdem bringen manche Distributionen – etwa Suse 9.3 – Mono auch bereits mit, im Gegensatz zu Red Hat und Fedora, die auf die Java-Plattform setzen.
Mehrere Websites wie etwa [6] dokumentieren den Fortschritt des Mono-Projekts im Einzelnen. Eine Übersicht über die Steuerelemente in der Bibliothek »System.Windows.Forms« ist beispielsweise unter [7] zu finden.
Eine Beispielanwendung mit Mono
Bestehende Visual-Studio-Dotnet-Projekte wie die implementierte Beispielanwendung lassen sich direkt in Monodevelop importieren. Danach darf man nicht vergessen, die Referenzen des Projekts neu einzustellen. An der Entwicklungsumgebung selbst fällt sofort die Kontexthilfe beim Editieren von Sourcecode auf. Ein GUI-Builder fehlt bisher.
Beim Übersetzen mit »mcs -r:System.Windows.Forms.dll Sourcedatei« bereitet das Standard-Steuerelement »System.Windows.Forms.NumericUpDown« Probleme, denn es ist in Mono nicht vollständig implementiert. Nach dem Entfernen des entsprechenden Code kompiliert die Anwendung und lässt sich mit der Laufzeitumgebung »mono« starten (Abbildung 4).
Dabei treten aber mehrere Fehler auf: So arbeitet der Update-Mechanismus, der für das Neuzeichnen der Anwendung zuständig ist, nicht korrekt, wenn sie von einer anderen Anwendung verdeckt wurde. Zudem unterlaufen dem Event-Mechanismus bei den Steuerelementen »RadioButton« und »ComboBox« Fehler.
|
Listing 1: GUI mit |
|---|
01 using System;
02 using System.Windows.Forms;
03
04 namespace LinuxMagazin.FirstApp
05 {
06 public class FirstApp : System.Windows.Forms.Form
07 {
08 public static void Main()
09 {
10 Application.Run(new FirstApp());
11 }
12
13 public FirstApp() : base()
14 {
15 this.Text = "First Application with GUI";
16 }
17 }
18 }
|
Der Konkurrent: DotGNU
Laut selbst vergebener Versionsnummer befindet sich das DotGNU-Projekt gegenüber Mono im Rückstand, die aktuelle Release ist 0.7. Der Kern von DotGNU heißt Portable Dotnet. Er besteht aus drei Hauptkomponenten: »treecc« (einem aspektorientierten Programmiertool), »pnet« (Laufzeitumgebung, C#-Compiler, Programmiertools) und »pnetlib« (C#-Systembibliothek mit den wichtigsten C#-Klassenbibliotheken).
Auf der DotGNU-Website stehen die Pakete als Quellcode- und als RPM-Pakete zur Verfügung. In der getesteten RPM-Variante waren keine weiteren Schritte notwendig, um eine funktionsfähige Umgebung zu erhalten, alle Tools arbeiteten auf Anhieb. Noch einfacher machen es aktuelle Distributionen wie etwa Debian 3.1. Hier ist die DotGNU-Umgebung standardmäßig enthalten (Paketname »pnet«). Zum Übersetzen und Starten der Hello-World-Anwendung sind diese Befehle notwendig:
cscc -o HelloWorld.exe HelloWorld.cs ilrun HelloWorld.exe
Zum Übersetzen eines komplexeren Projekts mit grafischem Interface dient folgende Befehlsfolge. Die Quellcode-Dateien befinden sich dabei im Unterverzeichnis »src«:
cscc -winforms -o Application.exe src/*.cs ilrun Application.exe
Die Implementierung der »System.Windows.Forms«-Bibliothek basiert nicht auf einer grafischen Bibliothek wie GTK, sondern zeichnet die Steuerelemente selbst, ähnlich wie die Swing-Bibliothek in Java. DotGNU verzichtet auf die Implementierung einer eigenen IDE.
Das Beispielprojekt unter DotGNU
Den von Windows stammenden Bytecode führt DotGNU ohne Modifikationen aus. Ein Klick auf die »RadioButton«-Steuerelemente löst die Ereignisroutinen jedoch mehrfach aus. Ein anschließendes Kompilieren der Sourcen mit DotGNU durch »cscc –winforms -o DemoApp.exe *.cs« ändert nichts an diesem Verhalten. Zudem ist für die erfolgreiche Übersetzung noch der Code zur Behandlung von »ImageList« zu entfernen.
Die mit DotGNU kompilierte Variante weist immer noch Fehler auf (Abbildung 5). Der Event-Mechanismus funktioniert auch dann nicht richtig: Das GUI-Element »RadioButton« löst Events weiterhin doppelt aus. »NumericUpDown« funktioniert überhaupt nicht und wird nicht korrekt dargestellt.
Das Steuerelement »GroupBox« zeigt den aktuelle Fokus durch eine Farbveränderung. Dieses Verhalten entspricht jedoch nicht dem Standard. Das »ImageList«-Steuerelement verhindert das Anzeigen der Anwendung. Das mit Mono erstellte Executable zeigt DotGNU an, allerdings mit fehlerhaften Icons auf den Knöpfen der Steuerleiste.
Eine Klausel der Microsoft-Dotnet-Lizenz verhindert die Veröffentlichung von Geschwindigkeitsvergleichen bei Dotnet-Implementierungen. Das DotGNU-Projekt stellt aber das Tool PNetmark zur Verfügung, das es jedem Interessierten ermöglicht, solche Tests für sich selbst durchzuführen, siehe dazu die DotGNU-FAQ, Abschnitt 1.4 [8].
|
Tabelle 1: |
|---|
Zusammenfassung
Mit dem Dotnet-Framework hat Microsoft einen interessanten Ansatz für die plattformunabhängige Programmierung vorgestellt. Die C#-Programmiersprache hat große Ähnlichkeit mit Java und C++ und ist für Anwender dieser Programmiersprachen leicht erlernbar. Ein Vorteil von C# ist zum Beispiel die Normierung durch die ECMA.

Abbildung 4: Die Beispielanwendung, unter Linux mit Mono ausgeführt, zeigt einige Probleme beim Zeichnen der Buttons oben und Auswahlfelder rechts.

Abbildung 5: Bei DotGNU läuft die grafische Dotnet-Anwendung nur mit Schwierigkeiten: Die Radio-Buttons lösen Events fälschlicherweise mehrfach aus.
Die beiden Open-Source-Implementierungen Mono und DotGNU verfügen über einen beeindruckenden Funktionsumfang, aber auch noch einige Ecken und Kanten. Bis zur vollständigen Kompatibilität bleibt für die Entwickler noch einiges zu tun. Beide Pakete ermöglichen trotzdem unter Linux die Software-Entwicklung für das Dotnet-Framework.
Probleme treten vor allem bei Verwendung der Bibliothek »System.Windows.Forms« auf, die unter Windows grafische Anwendungen realisiert. Eine problemlose Migration von grafischer Windows-Dotnet-Software nach Linux ist also noch nicht möglich. Als Alternative bleibt der Einsatz anderer GUI-Bibliotheken wie GTK#, Qt#, oder WX#. Da sie auch unter Windows zur Verfügung stehen, sind damit in Grenzen Cross-Platform-Anwendungen möglich – Dotnet-kompatibel sind diese aber nicht. (ofr)
|
Infos |
|---|
|
[1] Mono: [http://www.mono-project.com] [2] Thomas Kaufmann und Oliver Frommel, “Monokultur – Die Class-Library von Mono”: Linux-Magazin 01/05, S. 112 [3] DotGNU: [http://www.dotgnu.org] [4] Listings online: [https://www.linux-magazin.de/Service/Listings/2005/10/dotNET/] [5] Sharpdevelop-Homepage: [http://www.icsharpcode.net] [6] Entwicklungsstand von Mono: [http://www.go-mono.com/mono-roadmap.html] [7] »System.Windows.Forms«-Entwicklungsstand bei Mono: [http://svn.myrealbox.com/mwf/owners.html] [8] PNetmark: [http://www.southern-storm.com.au/pnet_faq.html#q1_4] |







