# Mono (Software)

Mono (spanisch für „Affe“ oder auch vom griechischen monos für „allein“ oder „einzig“) ist eine alternative, quelloffene Implementierung von Microsofts .NET Framework. Sie ermöglicht die Entwicklung von plattformunabhängiger Software auf den Standards der Common Language Infrastructure und der Programmiersprache C#. Entstanden ist das Mono-Projekt 2001 unter Führung von Miguel de Icaza von der Firma Ximian, die 2003 von Novell aufgekauft wurde. Die Entwickler wurden 2011 in eine neue Firma Xamarin übernommen, die im Jahr 2016 eine Microsoft-Tochtergesellschaft wurde. In der Folge wurde Microsoft Hauptsponsor des Projektes.

## Hintergründe und technische Details

Mono unterstützt eine hohe Anzahl an Plattformen und Architekturen. Durch Lizenzierung unter MIT-Lizenz gibt es für Entwickler und Nutzer praktisch keine Einschränkungen, so dass hohe Lizenzkosten für das Betriebssystem des Servers vermieden werden können, wenn .NET-basierte Software eingesetzt werden soll. Allerdings lässt sich inzwischen hierzu oft auch .NET Core verwenden. Hinzu kommt bei der Entwicklung von Smartphone-Apps der Wunsch, Code für verschiedene Plattformen (Android, iOS, Windows Phone) auf einer gemeinsamen Basis zu pflegen.
Microsoft dagegen bot seine Laufzeitumgebung .NET lange Zeit ausschließlich für seine eigenen Windows-Betriebssysteme an. Ursprünglich gab es von Microsoft eine Open-Source-Variante von .NET namens Rotor, welche neben Windows auch für FreeBSD und macOS verfügbar war. Dennoch war das Unternehmen Xamarin einst der Ansicht, dass es mit einer eigenen Entwicklung in diesem Bereich Erfolg haben könnte, insbesondere weil ihm die von Microsoft angebotenen Lizenzbedingungen für viele Bereiche zu restriktiv erschienen. Seit dem 12. November 2014 begann Microsoft, Teilmengen des .NET Frameworks via GitHub unter der MIT-Lizenz zu veröffentlichen. So befinden sich dort neben dem .NET Core und der offenen C#- und Visual-Basic-Compiler-Plattform Roslyn auch eine in der Entwicklung befindliche, plattformübergreifende Laufzeitumgebung, die .NET Core CLR. Mit diesen Projekten möchte Microsoft unter anderem die Entwicklung des Mono-Projekts unterstützen.
Mit Mono ist es möglich, Programme, welche für die Microsoft-.NET-Umgebung erstellt wurden, auch ohne Neuübersetzung unter unixähnlichen Betriebssystemen auszuführen. Der Vorteil einer solchen Crossplattform-Entwicklung besteht darin, den Komfort und Funktionsumfang der Microsoft Entwicklungsumgebung (Microsoft Visual Studio) zu nutzen. Auch SharpDevelop steht nur unter Windows zur Verfügung. Umgekehrt lassen sich mit MonoDevelop auf anderen Betriebssystemen Programme entwickeln, die auch mit Microsoft .NET lauffähig sind.
Mono bietet ab der Version 2.10 die Kompatibilität mit den nicht-Windows-spezifischen Bibliotheken von .NET-2.0. Anwendungen, die auf .NET 3.0 oder höher basieren, sind derzeit unter Mono unter Umständen nicht lauffähig, da bislang nur eine Teilmenge umgesetzt ist. Es fehlen Windows Presentation Foundation, Windows Workflow Foundation und teilweise Windows Communication Foundation. Des Weiteren ist der Zugriff auf windowsspezifische Funktionalitäten mittels P-Invoke oder COM Interop, d. h. die Verwendung von Bibliotheken, die nicht in IL-Code, sondern in normalem, Prozessor-spezifischem Assemblercode vorliegen, nicht gestattet. Zwar kann auch Mono auf Bibliotheken zugreifen, die in C oder C++ geschrieben sind, allerdings sind die meisten dieser Bibliotheken plattformabhängig.
Aktuell können Anwendungen auf Basis des .NET-4.7.2-Profils von Mono ausgeführt werden (Stand Januar 2019). Einschränkungen gibt es jedoch in verschiedenen Teilbereichen des Frameworks. Explizit ausgenommen wurde die Unterstützung der Windows Presentation Foundation, die auf absehbare Zeit nicht reimplementiert werden wird. XAML sollte im Rahmen von Moonlight unterstützt werden, dessen Entwicklung wurde allerdings eingestellt, später auch die des Original Silverlight. Im Rahmen von Xamarin Forms kam Xaml später aber trotzdem zum Einsatz.

### Besonderheiten von Mono

Mono implementierte auch eine Reihe von Funktionen, die sich im Namespace Mono.* befinden, beispielsweise Schnittstellen für betriebssystemnahe Funktionen unter Unix (Mono.Unix.Native) oder die Mono.Cecil.dll, mit der Änderungen an bereits kompiliertem Code vorgenommen werden können. Durch Verwendung von NuGet und dem .NET Standard sind diese auch für .NET und .NET Core nutzbar.
Des Weiteren ist die Generierung von nativem Code (aus der .exe oder .dll) mit Hilfe von mono --aot=full einfach und transparent möglich. Beim klassischen .NET ließ sich eine AOT-Kompilierung dagegen umständlich auf einem inoffiziellen Weg erreichen, indem man Tool NGEN (für das Administrator-Rechte benötigt wurden) für das Anwendungsprogramm verwendete, das Ergebnis landete dann in einem Native Image Cache mit kryptischem Dateinamen. Für .NET Core wird ab der Version 3 mit den Ready to Run-Images (R2R) eine Möglichkeit zur AOT-Kompilierung angeboten, dabei befindet sich der vorab compilierte Code in derselben Datei wie der IL-Code, auch können die benötigten Teile des Laufzeitsystems mit eingebunden werden.

## Geschichte

Das von Miguel de Icaza mitgegründete Unternehmen Ximian (am 4. August 2003 von Novell gekauft) setzte sich die Entwicklung einer Reihe von .NET-kompatiblen Entwicklungswerkzeugen zum Ziel, einschließlich eines C#-Compilers und einer Common Language Runtime für den Betrieb unter Windows, Linux, verschiedenen Unix-Derivaten sowie macOS.
Miguel de Icaza interessierte sich für die .NET-Technologie, seit im Dezember 2000 die ersten .NET-Informationen verfügbar wurden. Im Februar 2001 begann er zu Übungszwecken einen C#-Compiler der Programmiersprache in C# zu schreiben. Im April 2001 konnte er auf einer Gnome-Konferenz eine erste Version präsentieren.
Bei Ximian gab es intern viele Diskussionen über die Entwicklung von Tools zur Produktivitätssteigerung, um mehr Anwendungen in kürzerer Zeit zu erstellen und die Entwicklungskosten reduzieren zu können. Nach einer Machbarkeitsstudie entstand das Mono-Team. Wegen der begrenzten Anzahl der Mitarbeiter war es Ximian allerdings nicht möglich, einen vollständigen .NET-Ersatz zu schreiben, also wurde das Mono-Open-Source-Projekt gegründet, welches auf der O’Reilly-Konferenz im Juli 2001 bekanntgegeben wurde.
Drei Jahre später, am 30. Juni 2004, wurde Mono 1.0 veröffentlicht.
Mit der am 6. Oktober 2008 veröffentlichten Version 2.0 wurden die wichtigsten Eigenschaften von .NET 2.0 hinzugefügt und es gibt mit dem Projekt Olive auch eine Initiative, die neueren Technologien von .NET 3.0 und .NET 3.5 zu implementieren. Zudem wurde der C#-Compiler um die Sprach-Eigenschaften von C# 3.0 erweitert (hierbei handelt es sich in erster Linie um die Unterstützung von LINQ), sowie ein neuer XAML-Parser entwickelt. Allerdings weisen die Entwickler ausdrücklich darauf hin, dass die Windows Presentation Foundation wohl vorerst wegen der enormen Komplexität nicht implementiert wird. Ebenfalls mit der Version 2.0 ist nun auch ein Visual-Basic-8.0-Compiler mit an Bord.
Mit der am 9. Dezember 2009 veröffentlichten Version 2.4.3 wurde – neben einigen Fehlerkorrekturen – der freie C#-Compiler mit allen wesentlichen Funktionen von C# 4.0 ergänzt.
Anfang 2011 stellte der neue Novell-Eigentümer Attachmate die Weiterentwicklung des Mono-Projektes ein und entließ am 2. Mai 2011 30 Mono-Entwickler. Nils Brauckmann (der neue Suse-Chef) nannte als Grund die geringe Nachfrage bei den Kunden. Wenige Tage nach dem Stopp des Mono-Projekts bei Novell gründete Miguel de Icaza das Unternehmen Xamarin, das sich in Zukunft der Entwicklung von Mono widmen soll. Die meisten zuvor bei Suse angestellten Mono-Entwickler wechselten zu Xamarin.
In weiterer Folge gewährte SUSE Xamarin eine unbefristete Lizenz zur Nutzung und kommerziellen Verwertung von Mono, MonoTouch für iOS und Android sowie den Mono Tools for Visual Studio.
Mit der Übernahme durch Microsoft im Jahr 2016 wurden die Xamarin-Tools in Microsoft Visual Studio integriert und basierend auf der Xamarin-IDE Xamarin Studio wurde Visual Studio for Mac entwickelt. Mono wurde unter das Dach der .NET Foundation gestellt und unter der MIT-Lizenz neu herausgegeben.
Durch die Bereitstellung der .NET Core Plattform als Open Source unter einer kompatiblen Lizenz ist die gegenseitige Übernahme von Code für beide Projekte wesentlich vereinfacht. Seit Mai 2017 enthalten die offiziellen Pakete von Mono auch eine Version des C#-Compiler (Roslyn) sowie von MSBuild. Mit der aktuellen Version von Mono wird auch C# 8.0 vom Compiler unterstützt.
Für das Blazor-Framework mit WebAssembly-Client im Browser kommt eine Mono-Umgebung zum Einsatz, die als WebAssembly kompiliert wurde.
Ab der Version 5.12 werden auch IBM i und IBM AIX unterstützt.
Im August 2024 teilte Microsoft mit, das der Quellcode im ursprünglichen Repository möglicherweise archiviert wird und verwies auf zwei weiterentwickelte Abspaltungen von der WineHQ Organization und als Unterkomponente in der .NET-Laufzeitumgebung.

## Standardisierung und Patente

Vor der Übernahme von Xamarin durch Microsoft bestanden in der Open-Source-Szene erhebliche Bedenken gegenüber Mono, weil Teile der Klassenbibliothek möglicherweise Softwarepatente von Microsoft berührten. Microsoft hat dann mit Novell ein gegenseitiges Patentabkommen geschlossen, welches Novell und seine Kunden vor Rechtsansprüchen Microsofts schützt. Dieses beinhaltet auch einen Patentschutz für Mono. Für (fast) alle anderen Nutzer bestand das Risiko jedoch weiterhin. Die Sicht der Entwickler auf das Problem brachte Linus Torvalds auf den Punkt, als er sich durch Patentansprüche von SCO mit dem Thema konfrontiert sah: „Ich achte prinzipiell nicht auf Patente, denn das wäre Zeitverschwendung.“ Nicht ohne Grund sind Softwarepatente höchst umstritten und in der EU formal nicht gestattet.
Die grundlegenden Technologien sind teilweise durch Microsoft bei Ecma International und der ISO standardisiert worden. Microsoft garantiert eine Lizenzierung der ECMA-Teile auf RAND-Basis. Andere Teile, wie zum Beispiel Windows Forms, ADO.NET und ASP.NET sind hiervon jedoch ausgeschlossen.
Das Open Invention Network verteidigt Mono bei patentrechtlichen Auseinandersetzungen.
Aufgrund der Gefahr durch Patentklagen seitens Microsoft hatte auch Richard Stallman, der ideologische Führer der Freie-Software-Bewegung, vor Mono gewarnt, nachdem einige Distributionen dazu übergegangen waren, Mono in die Standardinstallation aufzunehmen. Microsoft hat mittlerweile .NET und C# unwiderruflich unter die Community Promise Vereinbarung gestellt und will auf Patentklagen verzichten.
Microsoft hat 2013 seine Strategie bezüglich .NET grundlegend geändert und arbeitet daran, den Quellcode von .NET komplett als Open Source offenzulegen. Dazu wurde von Microsoft, Xamarin und anderen die Stiftung .NET Foundation gegründet, welche die Rechte am .NET Framework übertragen bekommen hat. Durch die Offenlegung der Quellcodes unter der MIT-Lizenz bzw. Apache-2.0-Lizenz ist der Quellcode des .NET Frameworks nahezu beliebig – sprich auch in Closed-Source-Projekten – verwendbar. Lizenz- und patentrechtliche Auseinandersetzungen waren somit kaum noch möglich und somit auch nicht mehr zu befürchten. Microsoft und Xamarin arbeiteten seit 2015 gemeinsam daran, .NET auf unterschiedlichen Plattformen bereitzustellen. Dies mündete ein in die Übernahme von Xamarin durch Microsoft 2016, was Patentklagen gegen Xamarin (und Mono) natürlich erst recht sinnlos macht.
Im Mai 2019 kündigte Microsoft an, bis November 2020 .NET Framework, .NET Core und Mono zu einer einheitlichen Plattform .NET 5.0 zusammenzuführen, wobei von Mono die Ablauffähigkeit auf iOS und Android übernommen werden soll sowie die Unterstützung von AOT-Kompilierung. Dies wurde inzwischen relativiert und die vollständige Integration zunächst für .NET 6 angekündigt, dann auf Sommer 2022 verschoben ("One .NET").