„Mono“ е безплатен проект, с отворен код, воден от Xamarin (по-рано воден от Novell и първоначално от Ximian), за да създаде Ecma standard-compliant, набор от инструменти, съвместими с .NET Framework, като C# компилатор, Common Language Runtime и други. Логото на Mono е стилизирано маймунско лице, а mono означава „маймуна“ на испански език.

Обявената цел на Mono не е само да може да стартира приложения на Microsoft .NET междуплатформено, но и да предложи по-добри инструменти за развитие за разработчици на Linux. Mono може да работи на много софтуерни системи, като Android, повечето разделяния на Linux, BSD, OS X, Windows, Solaris и няколко игрови конзоли, като PlayStation 3, Wii и Xbox 360.

Проектът Mono е бил оспорван в общостта на отворения код, защото осъществява части от .NET Framework, които може вече да са покрити от патенти на Microsoft. Въпреки че стандардизирани части от .NET Framework са вече покрити от „Open Specification Promise“ на Microsoft, което е споразумение, гласящо че Microsoft няма да заявява своите патенти срещу изпълнения на своите спецификации под определени условия, други части не са, което означава, че проектът Mono може да бъде мишена на съдебни дела за нарушаване на патент.

История Когато Microsoft за пръв път представи своя .NET Framework през юни 2000 г. той е описан като „нова платформа базирана на Интернет стандартите“ и през декември същата година базисният иструмент Common Language Infrastructure е публикуван като отворен стандарт „ECMA-335“, така се отваря възможност за независими имплементации. Miguel de Icaza от Xamarin вярвал, че .NET има потенциала да увеличи продуктивността в областта на програмирането и започнал да проучва дали е възможна Linux версия. След осъзнаването, че техния малък екип не може да създаде и поддържа цял продукт, те публикували Mono с отворен код на 19 юли 2001 г. на O'Reilly конференцията.

След 3 години развитие, Mono 1.0 е публикуван на 30 юни 2004 г. Mono еволюира от първоначалната си цел да бъде платформа за развитие за Linux в това да подкрепя широк обхват от архитектури и операционни системи, както и вградените системи.

След като Novell бива купена от Attachmate през април 2011 г., Attachmate обявява стотици съкращения на работната ръка на Novell и така поставя бъдещето на Mono под въпрос.

На 16 май, Miguel de Icaza съобщава в своя блог, че Mono ще бъде подкрепян от Xamarin – компания, която той създава след напускането си от Novell. Оригиналният екип на Mono също се премстил в друга компания. Компанията Xamarin имала за цел да продължи работата си върху Mono и да напише наново търговските .NET блокове за iOS и Android, защото тогава MonoTouch и Mono за Android все още са били собственост на Novell. След съобщението на Miguel de Icaza бъдещето на Mono отново било поставено под въпрос.

Текущ статус и roadmap Текущата версия на Mono е 4.0.0 (от май 2015 г.). Тази версия предлага същественото API на .NET Framework и поддръжка за Visual Basic.NET и C# версии 2.0, 3.0 и 4.0. LINQ към обекти, XML и SQL са част от разпределението. C# 6.0 e режимът на работа по подразбиране на C# компилатора.

Целта на Mono е да подкрепя всички функции на .NET 4.5 с изключение на Windows Presentation Foundation, Windows Workflow Foundation, Windows Communication Foundation. Някои от липсващите части на .NET Framework са в процес на разработване в експериментален Mono подпроект, наречен Olive.

Moonlight Имплементация на Microsoft Silverlight с отворен код, наречена Moonlight е добавена от Mono 1.9. Moonlight 1.0 е публикуван на 20 януари 2009 г. и поддържа Silverlight 1.0 приложно-програмни интерфейси. Moonlight 2.0 поддържа Silverlight 2.0 и някои други приложения на Silverlight 3.0

Moonlight проекта е изоставен на 29 май 2012 г. Според Miguel, причините за това са две: добавянето на изкуствени ограничения от страна на Microsoft и фактът, че проектът не успява да събере достатъчно тракция в интернет.

Mono компоненти Mono се състои от 3 групи от компоненти: Базови компоненти Mono/Linux/GNOME блок за развитие Microsoft блок за съвместимост

Базовите компоненти включват – C# компилатор, виртуалната машина за Common Language Infrastructure и базовите клас библиотеки.

Mono/Linux/GNOME блокът за развитие осигурява инструменти за създаване на апликации при използване на GNOME и безплатни библиотеки с отворен код.

Microsoft блокът за съвместимост осигурява начин за пренасяне Windows .NET апликации към GNU/Linux. 

Framework архитектура Инструмент за кодово изпълнение Code Execution Engine Класови библиотеки Основна класова библиотека .NET клас библиотеки за съвместимост Mono специфични класови библиотеки Cross platform класови библиотеки за Mono и .NET (Gtk#, Mono Cecil, MonoCSharp, Text.Templating) Unix-specific класови библиотеки (POSIX, Filesystem in Userspace (FUSE), curses) Platform-specific класови библиотеки (автоматизации за: Mac, iOS, Android, MeeGo) CLI Assemblies CLI Metadata Common Language Runtime на Mono Съвместим с ECMA Common Language Infrastructure/.NET Common Language Runtime Mono-specific подобрения Mono.SIMD support Mono co-routines и продължения Mono-specific подобрения Native interop services and COM interop Защита – Transparent Code Framework

Code Execution Engine Машинното време на Mono съдържа code execution engine, който превежда ECMA CIL битови кодове в нативен код и поддържа брой процесори: ARM, MIPS (единствено в 32-битов режим), SPARC, PowerPC, S390 (в 64-битов режим), x86, x86-64 и IA-64 за 64-битови режими.

Кодовия генератор е изложен в 3 режима: Just-in-time (JIT) компилация: машинното време ще превърне ECMA CIL битовите кодове в нативни докато кодът се преработва. Ahead-of-time (AOT) компилация: този код превръща ECMA CIL битовите кодове и генерира нативен код, който е запазен в операционна система, архитектура и CPU специфичен файл. Този режим на операция компила повечето от кода, който обикновено се обработва по време на изпълнение. Има изключения като trampolines и друг административен код, който ще се нуждае от Just-in-time, за да работи. Full Static Compilation: този режим е поддържан само от шепа платформи и повежда Ahead-of-time процеса една стъпка напред и генерира всички trampoline-и, wrapper-и и proxy-та, които са необходими в един статичен файл могат да бъдат статично свързани с програма и напълно премахва нуждата за Just-in-time процес по време на работа. Това е използвано в операционните системи на iOS на Apple, Playstation 3 на Sony, Xbox 360 на Microsoft. 

Garbage collector От Моно 2.8 насам, Моно е с два garbage collector-а: generational и „Boehm conservative collector“. Garbage collector-a, който е по подразбиране преди Моно 3.1.1 (Boehm-Demers-Weiser Conservative Garbage Collector) има значителни ограничения в сравнение с виртуалната машина на Джава или с runtime-a на .NET платформата. Възможно е да възникне изтичане на памет от някои класове на приложения, заради garbage collector-a, затова може да е неподходящ за сървърни приложения, които протичат дълго време.

От октомври 2010 нов generational garbage collector, наречен Simple Generational GC (SGen-GC) става достъпен като част от Моно, започвайки от Моно 3.1.1, който е по подразбиране. За версии от Моно 2.8 до 3.1.0, потребителите могат да изберат да ползват SGen garbage collector като подадат ключа --gs=sgen към runtime-a на Моно при стартиране. Този нов garbage collector има много предимства пред традиционен консервативен скенър. Той използва generational garbage collection, където новите обекти се разпределят от място, по време на цикъла по събиране на излишни обекти и всички обекти, които са оцелели се преместват към по-старото поколение памет. Идеята е, че много обекти са временни и могат да бъдат бързо събрани, а само част от тях са дългосрочни обекти, които живеят през целия живот на приложението. За да подобри поведението, garbage collector-ът определя места с памет към всеки thread, за да позволи на thread-овете да пренасочат нови парчета памет, без да се налага да се съгласуват с други thread-ове. Преместването на нови обекти към старите се случва като се копират данните от старото място към новото „поколенческо“ място и се обновят всички указатели, които са сочили към данните, да сочат към новото място. Това може да е скъпо за големи обекти, затова SGen-a на Моно използва отделно място с памет за големи обекти (Large Object Section) и използва алгоритъма маркирай и изчисти (mark-and-sweep algorithm) за тези обекти.

Sgen се отнася със стака и регистрите консервативно и маркира всички обекти, които могат да бъдат отнесени към някои от тези корени. Предстоящата версия на Моно сканира управлявания стек точно, намалявайки броя на маркираните обекти.

Класова библиотека Класовата библиотека доставя обширен набор от удобства за разработка на приложения. Те са написани предимно на С#, но поради общата езикова спецификация (Common Language Specification) могат да бъдат използвани от всеки .NET език. Класовата библиотека е структурирана в пространства за имена (namespace) и разположени в споделени библиотеки, познати като асемблита. .NET платформата се отнася главно към тази библиотека от класове.

Пространства за имена и асемблита (Namespaces and assemblies) Namespace-овете са механизъм, с който логически да се групират сходни класове в йерархическа структура. Това предотвратява конфликти в имената. Структурата се прилага като се използват думи, разделени с точка, където най-честия namespace от високо ниво е System, например System.IO и System.Net. Има и други пространства от имена с високо ниво като например Accessibility и Windows. Потребител може да дефинира namespace като поставя елементи в блок за такива.

Асемблитата са физическото опаковане на класовите библиотеки. Това са .dll файловете, точно както и (но да не се бърка със) Wind32 споделените библиотеки. Примери за асемблита са mscorlib.dll, System.dll, System.Data.dll и Accessibility.dll. Namespace-овете са разпространени сред няколко асемблита и едно асембли може да е изградено от много файлове.

Инфраструктурата на общия език (Common Language Infrastructure) Инфраструктурата на общия език или по-известна като Common Language Runtime се прилага от Моно изпълнителя (Mono executable). Runtime-ът се използва за изпълнение на компилирани .NET приложения. Common Language Infrastructure се дефинира от ECMA стандарта. За да стартира приложение трябва да се извика runtime-a със съответните параметри.

Спецификацията на общия език (CLS) е уточнена в част 6 на ECMA-35 и дефинира интерфейса към CLI като конвенция като основните типове за Enum. Моно компилатора генерира изображение, което съответства на CLS. Това е Common Intermediate Language. Моно runtime-ът взима това изображение и го стартира. ECMA стандартът формално дефинира библиотека, която съответства на CLS като платформа.

Управляван и неуправляван код (Managed and unmanaged code) В чисто .NET/Моно приложение всичкият код е управляван, тоест е движен от стила на управление на памет на CLI и безопасност на thread-овете. Други .NET или Моно приложения могат да използват завещания код, който се определя като неуправляван, като използват System.Runtime.InteropServices библиотеки за да създават С# връзки. Много библиотеки, които се доставят с Моно използват тази особеност на CLI като Gtk#.

Моно-специфични иновации Моно е въвел изменения в някои среди с нови екстеншъни към базовия C# и CLI спецификации: C# компилатор като обслужване (използва C# компилатора като библиотека). C# интерактивна обвивка. SIMD съпорт като част от Mono.SIMD namespace, където извикванията от метод на специални векторни типове са директно свързани с CPU SIMD инструкциите на основния процесор. Пълна статична компилация на .NET код (използвана върху Mono/iPhone, Mono/PS3). Mono Coroutines (използвани за имплементация на микро-трединг код и разширения, най-вече за разработчици на игри). Асембли инжекции за процеси на живо. Използване на LLVM като JIT backend.