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 officiel
apt-get install mono mono-mcs libmono0 libmono1.0-cil libmono2.0-cil
[modifier] Package Debian non-officiel
Notez que je n'ai jamais réussi à obtenir un mono fonctionnel avec cette méthode. Je vous conseille plutôt la compilation.
Il vous faudra ajouter la ligne suivante Ă votre fichier /etc/apt/sources.list :
deb http://debian.meebey.net/ ./
Puis ajouter la clés GPG associée au serveur (et oui, c'est bien lourd ce truc) :
gpg --keyserver hkp://wwwkeys.eu.pgp.net --recv-keys 7127E5ABEEF946C8 gpg --armor --export 7127E5ABEEF946C8 | apt-key add -
et pareil...
apt-get install mono 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 mono mono-mcs mono-gmcs automake libtool pkg-config libglib2.0-0 libglib2.0-dev bison libxml-perl gawk
Puis on télécharge ce qu'il faut :
cd 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/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 automake ./configure make make install
S'il y a une erreur avec un fichier manquant. Retapez ces deux dernières commandes, cela devrait régler le problème.
Voila ce que j'obtiens personnelement 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 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.