Coder sur Windows en .NET, exécuter sur Linux avec Mono
Par Julien Chable, développeur/consultant chez Wygwam France sur les technologies Office, Open XML et SharePoint. Blog de Julien. |
Malgré le fait que les distributions Linux nécessitent encore des améliorations pour rendre Linux grand public, et ainsi rencontrer une large adoption dans les foyers, de nombreuses plateformes Linux sont déjà implantées dans les entreprises.
Comment utiliser ou réutiliser les applications développées par ses équipes sur la plateforme .NET en utilisant les ressources du parc de machines Linux dont vous disposez ? C’est principalement à cette question que répond le projet Mono que nous allons introduire dans cet article. Ce dernier a pour but de vous faire découvrir le projet Mono et de guider vos premiers pas vers cette plateforme à l’avenir prometteur.
Prérequis :
- Expérience avec C#/.NET
- Expérience en environnement Linux
- Microsoft Visual Studio 2005
Introduction
Mono est un projet Open Source lancé par Miguel de Icaza en 2001 qui fournit l’ensemble des composants logiciels nécessaires au développement et à l’exécution d’applications .NET sur les plateformes Linux/Unix, Solaris, Mac OS X et Windows (processeurs x86-64, IA64, ARM, Alpha, MIPS, SPARC, etc). Ce projet est sponsorisé par Novell ainsi que la communauté qui gravie autour de Mono.
A la façon du « build once, run everywhere » prôné par Java, Mono réalise également ce défi, puisqu’un projet réalisé sur station Windows avec Visual Studio tournera sur plateforme Linux/Mono sans avoir nécessairement à effectuer une recompilation de l’application.
Standards et normes
En offrant sa technologie à la standardisation, Microsoft a rendu possible les implémentations tierces de cette plateforme d’exécution applicatives qui aujourd’hui dépassent tout ce que l’on aurait pu imaginer à ses débuts. Cette initiative, étonnante pour l’époque de la part de Microsoft, représentait une opportunité pour le logiciel Open Source de pouvoir concurrencer Microsoft sur son propre terrain tout en innovant. Et c’est ce exactement ce que l’équipe de développement de Mono et de Novell, son principal sponsor, sont en train de réaliser.
Evidemment, la vie et le cycle de vie des différentes versions de Mono est géré par le cycle de vie et la maintenance des différents standards déposé à l’ECMA et approuvé par l’ISO :
- En Juin 2005 l’organisation de standardisation internationale Ecma a approuvé la 3ème édition de la CLI (Common Language Infrastructure) et de C# - standard ECMA 334 et ECMA-225 – pour devenir en Avril 2006, des normes ISO.
- En Juillet 2006, l’ECMA approuve la quatrième édition de ces standards correspondant aux versions 2006 des normes ISO.
Mono
Jusqu’à aujourd’hui, Microsoft a sorti 5 versions de son Framework : 1.0, 1.1, 2.0, 3.0 et 3.5. Néanmoins Mono possède ça propre numérotation et il est parfois difficile de bien comprendre les équivalences dans les deux mondes.
Pour résumer celles-ci rapidement voici quelques points de détail :
Mono 1.2 :
Implémente la totalité de .NET 1.1 (Core, XML, ADO.NET, ASP.NET, Windows.Forms, compilateurs et outils)
Inclut certaines assemblies de .NET 2 tel que :
- XML 2.0
- ASP.NET 2.0
- ADO.NET 2.0
- Mscorlib and System.dll
Mono 1.9 (la dernière version stable en date lors de la rédaction de cet article) représente 7 versions incrémentales par rapport à la version 1.2 de Mono. Une évolution qui se veut forcément significative dans les ajouts :
- Compilateur et runtime pour VB.NET
- Windows.Forms 2.0
- Web Services 2.0
- ASP.NET WebForms (sans WebParts) et ASP.NET AJAX
- Assembly System.Core, System.Media, System.Drawing et support de .NET 3
- LINQ (Linq to Objetc, Linq to XML)
- Etc …
Mono 2.0 (en Beta lors de la rédaction de cet article. Sortie prévue pour Q2 2008) :
- Support complet de .NET 2.0
- Outils de migration pour les développeurs Windows
Mono 2.2 (Sortie prévue pour Q4 2008) :
- Optimisations
- LINQ (Linq to DB)
- Preview/Beta de Olive : la version Mono de .NET 3
Sous projet supporté par Mono :
o Debugger
o Intégration de Java (via IKVM)
o .NET 3 :
- § WPF
- § WF
- § WCF
- § Cardspace
o Linq
o Silverligh, via un projet Moonlight
Au final, Mono est composé de plusieurs composants :
- La machine virtuelle d’exécution supportant CLI,
- Une bibliothèque de classes supportant tous les langages de la CLR et composé des classes compatibles avec .NET ainsi qu’un ensemble de classes supplémentaires,
- Des outils de développement : compilateurs, debugger, IDE, etc
L’utilisation d’une spécification commune pour les langages supporté (CTS ou Common System type) par la CLR permet de pouvoir exécuter des applications écrites dans des langages tel que : Managed C++, Java Script, Eiffel, Component Pascal, APL, Cobol, Perl, Python, Scheme, Smalltalk, Standard ML, Haskell, Mercury and Oberon. Ces langages possèdent des compilateurs, la plupart sur la plateforme Windows, et fonctionnent correctement (en dehors des problèmes de migration de bibliothèques de classes, d’appels systèmes, etc) sur Mono.
Installer Mono
Pour télécharger les installations de Mono, consultez la page suivante : http://www.go-mono.com/mono-downloads/download.html. Les installations sont disponibles pour OpenSuse, SLES/SLED, Windows, MacOSX, RedHat, Solaris et autres distributions Linux. Vous trouverez également un LiveCD OpenSuse et une image VMWare avec OpenSuse.
Windows
Sous Windows l’installation se révèle être des plus simple puisqu’un simple installer réglera cette tâche en un rien de temps sans vous demander plus d’effort.
Configurer Mono pour la ligne de commande
Néanmoins, si vous souhaitez appeler Mono depuis la ligne de commande, veuillez bien à spécifier à la variable d’environnement PATH le chemin vers le répertoire bin de Mono. Allez dans Propriétés Système/Avancé/Variables d’environnement puis éditez la variable PATH en concaténant (à la fin de la chaine à l’aide d’un point-virgule) le chemin menant vers le répertoire bin de Mono .
Linux
Linux est à n’en pas douter une excellente plateforme, néanmoins le nombre de distributions possédant des systèmes d’installation différent s’allongeant au fil du temps, il n’y pas une seule façon simple d’installer une application. Nous allons nous focaliser sur une distribution populaire et simple d’utilisation qui est OpenSuse (http://fr.opensuse.org), et voici deux méthodes pour pouvoir continuer cet article sans passer trop de temps en installation et configuration :
- Pour installer Mono sur une distribution OpenSuse existante, vous devrez dans un premier temps télécharger l’archive RPM sur le site officiel du projet Mono : http://www.go-mono.com/mono-downloads/download.html. Sélectionner la plateforme et la version du paquet à récupérer sur la page de téléchargement, puis une fois celui-ci télécharger, double-cliquez dessus pour lancer le gestionnaire d’installation qui vous proposera de l’installer.
- Sachez que le projet Mono met à disposition un LiveCD (un CD qui exécute le système en mémoire seulement sans installer ce dernier sur votre disque dur) qui vous permettra de tester Mono en moins de 5 minutes une fois l’image disque ISO téléchargée.
Dans le cadre de cet article, nous allons utiliser ce dernier pour des raisons de simplicité pour le lecteur évidente. Télécharger le LiveCD sur la page de téléchargement du projet : http://www.go-mono.com/mono-downloads/download.html.
Une fois en possession de l’image du LiveCD comportant une distribution OpenSuse 10 avec Mono préinstallé vous avez deux choix :
- Si vous possédez un deuxième PC ne vous servant pas pendant la durée de lecture de cet article, gravez l’image ISO sur un CD et lancer le processus de lancement du LiveCD en l’insérant au démarrage de l’ordinateur.
- Ou alors utilisez Virtual PC pour lancer une machine virtuelle avec l’ISO du LiveCD au démarrage de celle-ci.
Quelque soit votre choix, cela ne changera en rien les manipulations spécifiée et illustrée dans la suite de cet article.
Le LiveCD devrait vous ouvrir un bureau contenant des exemples de projet, un raccourci vers l’environnement de développement Mono ainsi que la documentation.
Remarque : Vous pouvez télécharger Virtual PC 2007 depuis cette adresse ci : https://www.microsoft.com/downloads/details.aspx?familyid=04D26402-3199-48A3-AFA2-2DC0B40A73B6&displaylang=fr
Créer l’application .NET sous Windows
Pour créer une application .NET sous Windows nous allons utiliser Visual Studio 2005 (uniquement pour des raisons d’importation de fichiers projet dans MonoDevelop, veillez à utiliser une version de Visual Studio 2003 ou 2005). L’utilisation de cet IDE nous permettra de réaliser le développement et le test d’une application console qui calculera le nième terme de la suite de Fibonacci.
- Ouvrez Visual Studio et créez un nouveau projet de type Console.
- Saisissez le code source suivant dans le fichier source Program.cs créé automatiquement par Visual Studio :
using System;
namespace SuiteFibonacci
{
class Program
{
static void Main(string[] args)
{
string input = null;
int iemeTermeFib = 0;
while (true)
{
Console.WriteLine("Veuillez saisir le nième terme de la suite de Fibonacci desire:");
input = Console.ReadLine();
switch (input)
{
case "quitter":
return;
default:
try
{
iemeTermeFib = Int32.Parse(input);
if (iemeTermeFib < 1)
throw new Exception();
}
catch (Exception)
{
Console.WriteLine("Veuillez entrer un nombre valide !");
continue;
}
break;
}
Console.WriteLine(String.Format("Le {0}ième terme de la suite de Fibonacci est '{1}'\n",
iemeTermeFib, Fibonnaci(iemeTermeFib)));
}
}
private static long Fibonnaci(int term)
{
long n1 = 1;
long n2 = 1;
if (term > 0)
{
if (term <= 2) return 1;
else
{
for (int i = 3; i < term; i++)
{
if ((i & 1) == 0) n1 += n2;
else n2 += n1;
}
return n1 + n2;
}
}
return -1;
}
}
}
Compilez ce code et exécutez le programme (Ctrl + F5) :
Une fois cette application compilée, testée et exécutée ; copiez les binaires et sources du projet sur la machine Linux.
Remarque : si vous utilisez l’image ISO prête à l’emploi, ne vous inquiétez pas, celle-ci a été configurée pour être capable d’échanger des données. En effet, vous pouvez activer le service SFTP (port 22) pour y transférer les fichiers nécessaires dans le répertoire home/Linux - utilisateur courant - à l’aide de votre logiciel FTP favori. Le login/mot de passe pour ce LiveCd OpenSuse Mono sont root/mono.
Migrer une application .NET
Le projet Mono étant en constante évolution à l’instar de la plateforme .NET, les implémentations des librairies ont toujours un peu de retard, en tout honneur, par rapport à celles de Microsoft. Par conséquent, comment s’assurer que tout ce qu’utilise votre application est implémenté par Mono : en utilisant l’outil de migration Mono Migration Analysis.
MoMA vous aide à identifier les problèmes que vous pouvez rencontrer en migrant votre application .NET vers Mono. MoMA vérifie que tous les aspects spécifiques liés à la plateforme (appels natifs, etc) et les librairies soient supportés par Mono. Cependant, MoMA ne peut pas faire toutes les vérifications ni assurez que tout soit correct même si tout le laisse à croire.
Pour s’en assurer, le seul test est toujours d’effectuer la migration, de modifier les portions critiques non supportées par Mono, s’il y en a, de relancer le jeu de tests et d’exécuter l’application sur Mono.
Expérimenter MoMA sur notre projet
Tout d’abord télécharger MoMA sur votre ordinateur Linux depuis cette page : https://www.mono-project.com/MoMA. Décompresser l’ensemble sur la machine et exécuter MoMA.exe :
Passez l’étape numéro qui introduit MoMA en cliquant sur le bouton Next. L’étape 2 vous propose d’ajouter les bibliothèques de classes ou les exécutables à tester :
Une fois les différents éléments ajoutés, passez à l’étape 3 en cliquant sur ‘Next’ afin de voir les résultats des tests affichés :
L’application .NET étant des plus simples, celle-ci ne devrait pas souffrir de problème de portage sur la plateforme Mono comme nous l’indique MoMA.
Sachez que cette tâche peut prendre un certain temps lorsque vous testez de grosses assembly ou des exécutables volumineux. N’oubliez pas que si MoMA détecte un problème, vous ne pourrez que rarement l’ignorer et vous devrez le corriger. Néanmoins, ce n’est pas parce que MoMA ne vous indique pas d’endroit problématique qu’il n’y en aura pas.
Exécuter l’application .NET sous Linux avec Mono
L’utilisation d’une machine virtuelle permet tout comme la plateforme Java de pouvoir faire abstraction, dans une moindre mesure, de la plateforme d’exécution. Nous allons donc lancer l’application .NET créé avec Visual Studio sous Windows sans avoir de modification à réaliser comme le montre la capture suivante :
Exécuter une application .NET avec des technologies Microsoft n’est donc plus qu’une utopie, et grâce à Mono, c’est aujourd’hui une réalité ! Néanmoins, sachez que cela n’est pas toujours le cas et que vous aurez souvent à modifier tout ou partie de certaines bibliothèques spécifiques pour que votre application s’exécute aussi bien sur la CLR Microsoft que sur celle de Mono et vice versa.
Importer le projet Visual Studio dans MonoDevelop
Vous avez développé une application en .NET avec Visual Studio et vous souhaitez la porter ou la maintenir sur la plateforme Mono ; MonoDevelop l’IDE associé au projet Mono, vous permettra de continuer votre travail en gardant votre productivité dans votre développement.
Vous n’aurez pas à recomposer vos fichiers source de projets puisque MonoDevelop supporte l’importation de projet Visual Studio 2003 et 2005.
Les exemples de Mono
Le LiveCD de Mono met à votre disposition un ensemble d’exemple sur lequel il est important de porter son attention quelques minutes pour mieux comprendre comment porter une application .NET sur Mono et comment développer des applications avec la plateforme Mono.
Vous trouverez dans les deux répertoires prévu à cet effet plusieurs exemples d’applications Console ou WinForm (supporté par GTK#) et des exemples de sites web ASP.NET. Les sources des projets WinForm se trouvent dans /home/linux/WinFormsSource et pour les sites web dans usr/share/mono/asp.net.
Conclusion
Mono est un projet Open Source de qualité à plus d’un point. Cela se traduit par une exécution des différents outils et utilitaires sans bug notoire, une bonne documentation, un projet et une communauté active. On notera également un packaging de très haut niveau, l’utilisation du LiveCD OpenSuse illustre bien du travail minutieux de l’équipe de développement.
Au-delà du projet en lui-même, Mono représente une réelle alternative à l’exécution d’application .NET et de site web ASP.NET sur des plateformes Microsoft et non Microsoft. Enfin la technologie .NET s’ouvre à toutes les autres plateformes sur laquelle elle était jusqu’à présent absente. Mono tend à se démocratiser et à évoluer au fil des années, et même si de plus en plus d’acteurs l’utilise pour développer leur application, la réalisation de projet Mono peine à évoluer malheureusement. Les future sorties Mono, et notamment celle du sous projet Olive (implémentation de .NET 3) devrait amener un vent de soutien à l’adoption de Mono dans les entreprises et les solutions à l’heure où le mot d’ordre est : Interopérabilité.
Références
- Projet Mono : https://www.mono-project.com
- Mono Migration Analyzer : http://mono-project.com/MoMA
- Sources de Mono : http://www.go-mono.com/mono-downloads/download.html