Coder sur Windows en .NET, exécuter sur Linux avec Mono

Julien ChablePar 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.

Setup Mono

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 .

Setup Path

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.

Download ISO

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.

Launch OpenSuse

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.

Suse Desktop

Mono

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.

  1. Ouvrez Visual Studio  et créez un nouveau projet de type Console.
  2. 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;
        }
    }
}
  1. Compilez ce code et exécutez le programme (Ctrl + F5) :

    Console

  2. 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.

Mono Migration Analyzer

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 :

Folder MOMA

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 :

Mono Migration Analyzer - Step 2

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 :

Mono Migration Analyzer - Step 3

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 :

Console

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.

MonoDevelop Open Solution

 

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.

Mono Desktop Samples

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.

Mono ASP Website

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