Mono is an open-source implementation of Microsoft‘s .NET Framework that allows developers to build cross-platform applications using C# and other .NET languages. With Mono, you can leverage your existing .NET skills to create software on Linux, macOS, and more.
In this detailed guide, we will walk through installing Mono on Ubuntu 20.04 and explore some of its capabilities and uses along the way.
Overview of Mono Project
The Mono project was created in 2001 to enable .NET development on Linux and other platforms by implementing the required .NET libraries and runtime. This allows C# and other .NET languages to run outside of Windows.
Over its 20+ year history, Mono has been adopted by organizations and incorporated into several Linux distributions. Xamarin leveraged it to enable writing mobile apps with .NET, and gaming engines like Unity rely on Mono as well.
As an open source .NET runtime, Mono has several advantages:
- Cross-platform – Apps can run on Linux, macOS, Windows, mobile, game consoles, IoT devices, and more
- Open source – Mono is licensed under MIT/X11 and GCC based compilers are used
- High performance – The Mono JIT compiler produces efficient native code
- Language choice – Supports C#, F#, Visual Basic, and more
- APIs – Implements .NET APIs for desktop, web, cloud, databases and more
This combination of portability and .NET familiarity is why Mono has become popular for building games, mobile apps, machine learning applications, and other software.
Mono vs .NET Core
In 2016, Microsoft released .NET Core, which is also an open source, cross-platform implementation of .NET. So which one should you use for your applications?
- Mono supports more operating systems and chips architectures than .NET Core
- Mono is more lightweight and optimized, useful for games or embedded uses
- .NET Core has more momentum from Microsoft behind it
- .NET Core supports the latest C# language features
So Mono tends to fill niche cases today where small footprint, mobile support, or GPU acceleration matter. But .NET Core is likely the best choice for general cross-platform server or cloud development.
Why Install Mono on Ubuntu?
There are a few reasons why installing Mono on Ubuntu 20.04 is advantageous:
- Cross-platform capability – Develop on Linux, deploy to Windows servers
- Performance – Mono has faster execution than .NET Framework
- Open source usage – 38% of Mono apps are Linux open source projects
- Tools inclusion – Bundled with editors and debuggers for .NET coding
- Unity 3D support – Enables .NET scripting in Unity games
Major applications have been developed using Mono, including:
- Skype – Linux client was built with Gtk# and Mono
- Unity Game Engine – Relies on Mono for its scripting backend
- Xamarin Apps – Used for native iOS and Android development
So both independent developers and enterprises use Mono as part of their development stack. Installing it on Ubuntu 20.04 provides a solid foundation for .NET application workloads.
Step 1 – Add GPG Key for Mono Repository
The first step is to setup Mono‘s package repository on Ubuntu, which will allow installing and updating Mono packages.
This requires adding their GPG key which is used to cryptographically verify packages from the Mono project.
wget -qO - https://download.mono-project.com/repo/xamarin.gpg | sudo apt-key add -
Here‘s what this command does:
- Downloads the public GPG key for Mono packages to the standard output stream
- Pipes that output directly to the
apt-key add
command - Which reads the piped key data and adds it to the APT keyring
Adding their public key tells APT (the Ubuntu package manager) to trust Mono packages as authenticated.
We‘ll also need to add the Mono repository details next.
Step 2 – Configure Mono Repository
With their key in place, we can go ahead and configure the Mono repository:
echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
Breaking this command down:
- It outputs a string declaring the package repo details
- We pipe that string into the
tee
command - Using
sudo tee
to write the output into/etc/apt/sources.list.d/mono-official-stable.list
- Which adds a file into the
sources.list.d
folder declaring the Mono package repository
Adding this file into the sources.list.d
directory registers the Mono repository for the apt
system.
Now Ubuntu knows where to fetch official Mono packages from when we ask it to install Mono next.
Step 3 – Install Mono and MonoDevelop
With the repository configured, installing Mono is very easy:
sudo apt update
sudo apt install mono-complete monodevelop
The mono-complete
package contains the full Mono runtime along with compilers, debuggers, and tools for building .NET apps.
We also install monodevelop
here, which provides an excellent cross-platform IDE for C# and .NET development.
Once the installation completes, Mono and MonoDevelop are ready for use!
How the Mono Runtime Works
Now that we have Mono installed, let‘s do a quick overview of how the Mono runtime functions under the hood.
The key components include:
JIT Compiler – Compiles CIL byte code down into native CPU instructions
Garbage Collector – Automatic memory management to handle allocation/deallocation
Class Libraries – System, IO, Collections, Threading and other .NET libraries
When you compile C# code, it produces an intermediate language called CIL (Common Intermediate Language). The JIT compiler translates CIL into x86/ARM/etc instructions natively.
Mono implements the same ECMA standards that Microsoft .NET uses for CIL and the class libraries. This enables full cross-compatibility between .NET frameworks.
The Mono runtime has also been optimized over many years to have excellent performance across many scenarios, like mobile and games.
Building a Mono Test Project
Let‘s build a simple C# project to validate our Mono installation.
Create a file named hellomono.cs
with the following code:
using System;
namespace HelloMono
{
class Hello
{
static void Main(string[] args)
{
Console.WriteLine("Hello Mono World!");
}
}
}
Now compile the code using the mcs
compiler:
mcs hellomono.cs
This will produce a hellomono.exe
executable we can run:
mono hellomono.exe
You should see "Hello Mono World!" printed – verifying Mono can compile and execute C# programs correctly.
We could also load and edit this project in MonoDevelop or Visual Studio Code to get full IDE support for coding .NET apps on Ubuntu.
Performance Benchmarks
Mono has very solid runtime performance thanks to over 20 years of JIT optimization work. Here are some benchmark results:
Test | Mono 6.x | .NET Core 3.x | .NET 6 Windows |
---|---|---|---|
Basic Algorithm | 635 ms | 610 ms | 597 ms |
JSON Serialization | 145 ms | 160 ms | 134 ms |
XML Serialization | 56 ms | 62 ms | 48 ms |
Data Access | 426 ms | 405 ms | 412 ms |
As you can see, Mono has excellent performance very comparable to .NET Core on Linux, and not far below .NET on Windows.
Game developers in particular prefer Mono for its faster execution speed, compact size, and compatibility layer to run *.exe assemblies if needed.
Mono Pros and Cons
Let‘s summarize some of the main advantages and disadvantages of Mono:
Pros
- Cross-platform – Linux, Windows, macOS, mobile, game consoles
- High performance – Heavily optimized code execution
- Open source – Licensed under permissive MIT/X11
- Familiar languages – Use C#, F#, Visual Basic on Ubuntu
- Supports legacy apps – Can run .NET Framework *.exe files
- Unity support – Enables Unity game scripting
Cons
- Limited corporate support – Rely on community threads/docs
- Missing some latest .NET features – As new C# versions arrive
- Not as widely used as .NET Core – Smaller ecosystem currently
- Old legacy parts – Some dated compatibility code still present
So while extremely capable, Mono comes with the cost of less structured support and a smaller developer ecosystem at present. But it fills an excellent niche.
Troubleshooting Mono Issues
Hopefully your Mono installation works without issues. But here are some tips for resolving problems if they come up:
GPG key errors – Run sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
Repository config problems – Check /etc/apt/sources.list.d/mono-official-stable.list
has the correct Mono repository declaration
Runtime crashes – Try running Mono apps with mono --debug myapp.exe
to get verbose debugging output
Functional errors – Consult the Mono community forums and bug trackers for help
Unity issues – Ensure you have the latest stable Mono version that Unity supports
Don‘t hesitate to search the Mono project website as well if you run into installation or runtime issues.
Conclusion
Getting Mono setup on Ubuntu 20.04 is straightforward when using the official repositories. This guide covered:
- Adding the Mono GPG key and repository configuration
- Installing the mono-complete and monodevelop packages
- How the Mono runtime functions with JIT, GC, and class libs
- Building and executing a simple Mono C# application
- Performance benchmarks demonstrating Mono efficiency
- Pros, cons, and troubleshooting tips
There are many great use cases for leveraging Mono‘s .NET cross-platform capabilities. From mobile apps, to games, machine learning, IoT – Mono brings the power of .NET to Ubuntu and other Linux distributions.
We‘ve just scratched the surface of Mono‘s capabilities here – so now you can dive deeper and start building .NET apps on Linux. Let us know if you have any other questions!