Mono : .Net sous Linux

Un article de LaPageDuJour.

Aller Ă  : Navigation, Rechercher

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

Vous n'avez plus qu'Ă  taper
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.