Mono : .Net sous Linux
Un article de LaPageDuJour.
Sommaire |
[modifier] Introduction
Si vous ne l'avez pas encore compris, Mono l'outil idéal pour vos projets informatiques professionnels :
- Vous développez vos logiciels dans Visual Studio (2005/2008) qui est incontestablement l'environnement de développement le plus intuitif et performant.
- Vous les exécutez tels quels sur vos serveurs Linux grâce à Mono.
Dans tout ce qui suit, nous supposerons que vous utiliserez la meilleur distribution de Linux : Debian (vous pouvez vous référer au premier cours Linux pour son installation).
Sachez que l'équipe Mono (sponsorisée par Novell) est extrêmement rapide. Ils sont actuellement en train de porter le framework .Net 3.5, avec LinQ.
[modifier] Installation
Mono est Ă ce jour (03/01/08) en version 1.2.6. Il supporte le Framework .Net 1.1 et l'essentiel du Framework .Net 2.0.
Pour information Debian/Etc fournit la version 1.2.2.1, Le package non-officiel la 1.2.5 et sur le SVN de Mono, vous aurez la 1.2.6.
[modifier] Package Debian Backports (recommandé)
C'est vraiment la méthode qu'il faut préférer. Elle vous permettra d'installer et mettre à jour une version de mono à jour très facilement.
Dans /etc/apt/sources.list, ajoutez la ligne :
deb http://www.backports.org/debian etch-backports main contrib non-free
Ensuite, pour authentifier cette source, installez (de manière non sécurisée) les clés d'authentification :
apt-get install debian-backports-keyring
Puis, installez mono :
aptitude -t etch-backports install mono-2.0-devel
[modifier] Package Debian officiel
Le package Debian officiel est fonctionnel mais totalement dépassé.
apt-get install mono mono-mcs libmono0 libmono1.0-cil libmono2.0-cil
[modifier] Compilation depuis les sources SVN
Pour information, le répertoire de compilation de Mono pèse près de 800 Mo à la fin de la compilation. Vous l'aurez donc compris, c'est un gros projet. Comptez à peu près une heure de téléchargement et compilation sur une machine moderne.
On installe d'abord svn, puis des outils et même mono pour simplifier la compilation antérieur :
apt-get install subversion make automake autoconf python gcc g++ libtool pkg-config bison libxml-perl gawk
Puis on télécharge ce qu'il faut :
mkdir ~/mono cd ~/mono svn co svn://anonsvn.mono-project.com/source/trunk/mcs svn co svn://anonsvn.mono-project.com/source/trunk/mono svn co svn://anonsvn.mono-project.com/source/trunk/libgdiplus #svn co svn://anonsvn.mono-project.com/source/trunk/gtk-sharp
Fixer une petite variable d'environnement pour que cela compile :
export PKG_CONFIG_PATH=/usr/lib/pkgconfig/
Puis vous allez pouvoir tout compiler, c'est vraiment long :
cd ~/mono/mono ./autogen.sh make make install
S'il y a une erreur avec un fichier manquant. Retapez "./autogen.sh"
Si vous n'avez pas encore de mono ou une version trop vieille, vous devrez taper :
make get-monolite-latest make EXTERNAL_MCS=false
Voila ce que j'obtiens entre la version Debian et la version compilée :
mono --version
Mono JIT compiler version 1.2.2.1, (C) 2002-2006 Novell, Inc and Contributors. www.mono-project.com
TLS: normal
GC: Included Boehm (with typed GC)
SIGSEGV: normal
Disabled: none
dedibox1:~/mono/mono# mono --version
Mono JIT compiler version 1.9 (/trunk/ r99311)
Copyright (C) 2002-2007 Novell, Inc and Contributors. www.mono-project.com
TLS: __thread
GC: Included Boehm (with typed GC)
SIGSEGV: altstack
Notifications: epoll
Architecture: x86
Disabled: none
[modifier] Utilisation
[modifier] Execution
Si vous avez compilé mono, prenez garde à bien exécuter /usr/local/bin/mono et non /usr/bin/mono
mono application_a_executer.exe
[modifier] Compilation
Pourquoi faire ? Vous pouvez le faire sous Windows.
[modifier] Problèmes
[modifier] mscorlib.dll introuvable ou dépassé
Deux erreurs possibles :
- The assembly mscorlib.dll was not found or could not be loaded.
- Une autre disant que mscorlib.dll est dépassée
Solution :
cd ~/mono mkdir -p /usr/local/lib/mono/1.0/ wget http://mono.ximian.com/daily/monolite-latest.tar.gz cp monolite-XXXXXXXX/* /usr/local/lib/mono/1.0/
Et vous repartez pour votre installation :
cd ~/mono/mono make install
[modifier] Il manque une méthode
Si vous avez une erreur de ce type lĂ :
Missing method System.Net.Sockets.TcpListener::BeginAcceptTcpClient(AsyncCallback,object) in assembly /usr/lib/mono/gac/System/2.0.0.0__b77a5c561934e089/System.dll
Essayez de recompiler depuis les sources. J'ai moi même eu ce problème et il a été rêglé en recompilant depuis les sources. Il s'agit de classes ou de méthodes .Net qui n'ont pas encore été portées par l'équipe Mono.
[modifier] Ne jamais faire
Sur un site on peut retrouver l'information disant qu'il suffit de faire "cd /usr/lib/mono; ls -s 1.0 2.0", c'est parfaitement faux.
Cela permettra juste Ă vos applications .Net 2.0 de tourner sans la librairie 2.0 mais bien sur qui elles n'utilisent que des instructions .Net 1.0
Vous obtiendrez alors des erreurs de ce type :
WARNING **: The class System.Collections.Generic.Dictionary`2 could not be loaded, used in mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Unhandled Exception: System.TypeLoadException: Could not load type 'System.Collections.Generic.Dictionary`2' from assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
[modifier] Compilation sur des machines peu puissantes
Le framework .Net n'est généralement pas choisi pour ses performances, cependant celles ci sont tout à fait satisfaisantes. Et c'est pourquoi, il se prête tout à fait aux environnement embarqués.
Pour compiler Mono sur des machines "légères" comme le NSLU2, vous pouvez :
- Réaliser la compilation depuis les sources (cela risque de vous prendre un paquet de temps)
- Utiliser la version obsolète de Mono fournie par Debian (vous risquez de le regretter)
- Faire de la cross-compilation en utilisant des outils comme ScratchBox
[modifier] Temps d'exécution
Si vos temps d'exécution sont (trop) élevés (genre plus que le même programme en Java ou en PHP), tout d'abord, c'est normal, Mono n'est pas ultra performant. Cependant, cela est souvent aussi lié à l'utilisation d'un binaire compilé en mode Debug plutôt qu'en mode Release. Sachez que les optimisations faites lors de la compilation en mode Release peuvent avoir des conséquences notables (gain de 30%) sur les performances.
[modifier] Décalage horaire
C'est un détail mais cela peut être handicapant. Lors du changement d'heure, le 30/03/2008, j'ai pu remarqué certaines anomalies où au lieu d'avoir une heure à UTC+2, l'heure locale (DateTime.Now) était à UTC. Ainsi, j'ai une horloge qui est passé de 2h à 5h.
[modifier] ASP.Net
Ici, nous allons voir comment mettre en place ASP.Net avec Mono (il faut un Mono déjà installé) et lighttpd.