You are on page 1of 25

1

samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 1 1


La technologie .NET
ASP.NET et les Web Services
La technologie .NET
ASP.NET et les Web Services
Samia Bouzefrane
Matre de Confrences
CEDRIC CNAM
samia.bouzefrane@cnam.fr
http://cedric.cnam.fr/~bouzefra
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 2 2
ASP.NET
ASP.NET
2
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 3 3
ASP.NET
Version 2.0
Successeur de ASP
Permet lcriture de pages Web dynamiques (Web Form)
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 4 4
Architecture
3
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 5 5
Structure dune page ASP.NET
Une page ASP.NET possde une extension .aspx
Une partie fait apparatre les scripts (C#, Javascript).
Une partie : code html
Une partie <asp :> et <% %> : balise douverture pour un WebForm
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 6 6
<html>
<head>
<script language= "c#" runat="server">
type fct (type i) { }
</script>
<script language= "javascript">
function f ;
</script>
</head>
<body>
<table>

</table>
<asp :Label [Proprits]></asp :Label>
<% =fct(5) %>
</body>
</html>
Exemple de Page ASP.NET
4
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 7 7
Tout script (crit en C# par exemple) pour ASP.NET doit se trouver entre
les balises:
<script language= "c#" runat= "server">

</script>
Le tout doit se trouver entre la balise html <head> et </head>.
runat="server" : script excut ct serveur.
Dans une page, un seul langage .NET est accept.
Script de traitement
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 8 8
<head>
<script language= "c#" runat= "server">
string Demain()
{
DateTime Jour=DateTime.Now ;
Jour=Jour.AddDays(1) ;
return Jour.ToString() ;
}
</script>
</head>
<body>
<form runat="server">

Date du jour :
<% =DateTime.Now.ToString() %>
<br>
Date de demain : <% =Demain() %>

</form>
</body>
<head>
</head>
<body>
<form runat="server">

Date du jour : <% =


DateTime.Now.ToString() %>
<br>
Date de demain :
<%
DateTime Jour=DateTime.Now ;
Jour=Jour.AddDays(1) ;
Response.Write(Jour.ToString()) ;
%>

</form>
</body>
Exemples
5
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 9 9
Les composants/ contrles
Label
Button
TextBox
CheckBox
RadioButtonList
ListBox
DropDownList
Image
ImageButton
Hyperlink
LinkButton
Panel
Calendar
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 10 10
Proprits communes
Id : Tout composant a un nom Id.
OnClick : est lvnement correspondant au clic sur un composant,
par exemple un bouton.
Runat : permet de spcifier o le traitement du composant doit tre fait.
Text : est la valeur affiche par le composant.
OnTextChanged : est lvnement lorsque le texte change.
6
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 11 11
Proprits des composants
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 12 12
Label (zone daffichage)
<head>
</head>
<body>
<form runat="server">
<asp:Label id="IdLabel" text="<b>Mon premier composant
asp" runat="server"/>
</form>
</body>
7
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 13 13
<head>
<script language="c#" runat="server">
void Envoi(Object Sender, EventArgs E)
{
IdLabel.Text="Notre deuxime composant asp fonctionne :)";
}
</script>
</head>
<body>
<form runat="server">
<asp:Label id="IdLabel" text="Mon premier composant asp"
runat="server"/>
<br>
<asp:Button id="IdBouton" text="Envoyer" OnClick="Envoi"
runat="server"/>
</form>
</body>
Button (bouton)
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 14 14
TextBox (zone ddition) et Proprits
Une zone ddition peut avoir les proprits suivantes :
Columns : il sagit de la largeur du contrle exprime en nombre
de caractres.
MaxLength : est le nombre maximal de caractres qui seront admis.
Pour avoir un effet, il faut que TextMode corresponde SingleLine ou
Password.
Rows : est le nombre de lignes visibles. Il faut dans ce cas que
TextMode soit MultiLine. Dfilement vertical si saisie de plus de lignes.
TextMode : Les trois modes possibles sont SingleLine, MultiLine
ou Password.
Wrap : stipule si oui ou non il y a passage automatique la ligne
dans une zone ddition de plusieurs lignes.
8
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 15 15
TextBox : Exemple
<head>
<script language="c#" runat="server">
void Envoi(Object Sender, EventArgs E)
{
IdLabel.Text=IdSaisie.Text;
}
</script>
</head>
<body>
<form runat="server">
<asp:Label id="IdLabel" text="Mon premier composant asp"
runat="server"/>
<br>
<asp:Button id="IdBouton" text="Envoyer" OnClick="Envoi"
runat="server"/>
<br>
<asp:TextBox id="IdSaisie" runat="server"/>
</form>
</body>
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 16 16
CheckBox (case cocher)
Une case cocher permet de faire un choix de type oui/non ou vrai/faux.
Proprits :
Checked : est true si la case est coche et false dans le cas
contraire.
TextAlign : est la position du libell par rapport la case.
Les valeurs possibles sont Right ou Left.
<asp:CheckBox id="IdCase" runat=server" text="S'incrire
la mailing-list"/>
9
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 17 17
RadioButtonList (boutons radio)
Composant utilis lorsque lon a plusieurs choix mais avec
une seule valeur choisir.
Il y a deux syntaxes :
<asp:RadioButton id="Madame"
runat="server" text="Madame"
GroupName="rblMmeMlleMr"/>
<asp:RadioButton id="Mademoiselle"
runat="server" text="Mademoiselle"
GroupName="rblMmeMlleMr"/>
<asp:RadioButton id="Monsieur"
runat="server" text="Monsieur"
GroupName="rblMmeMlleMr"/>
<asp:RadioButtonList id="rblMmeMlleMr"
runat="server">
<asp:ListItem value="Madame" />
<asp:ListItem value="Mademoiselle" />
<asp:ListItem value="Monsieur />
</asp:RadioButtonList>
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 18 18
DropDownList (bote combo)
La bote combo possde les mmes proprits quune ListBox.
Une bote pour choisir le mois de naissance :
<asp:DropDownList id="IdMoisNaissance" runat="server" >
<asp:ListItem text="Janvier" />
<asp:ListItem text="Fevrier" />

<asp:ListItem text="Octobre" />


<asp:ListItem text="Novembre" />
<asp:ListItem text="Decembre" />
</asp:DropDownList>
10
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 19 19
Image
ImageUrl qui est ladresse de limage (relative ou absolue).
AlternateText est le texte afficher si limage ne peut ltre.
ImageAlign est lalignement de limage par rapport au contour de son
composant. On retrouve comme valeurs acceptes AbsBottom,
AbsMiddle, Bottom, Left, Middle, Right, Top, etc.
<asp:Image ImageUrl="image.gif" runat="server" AlternateText="Made
with ASP.NET"/>
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 20 20
ImageButton
A ce composant est associ un vnement lors du clic.
Seule proprit : ImageUrl.
void ibClick(Object Sender, ImageClickEventArgs E)
{
IdImageButton.Text="Un bouton Image!";
}
....
<asp:ImageButton ImageUrl="image.gif" runat="server"
AlternateText="Une info" OnClick="ibClick"/>
<asp:Label id="IdImageButton" runat="server" text=""/>
11
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 21 21
Hyperlink (hyper-lien)
Les caractristiques sont simples :
ImageUrl est limage qui contient le lien (si lon dsire
utiliser une image comme hyperlien). Si cette proprit est
utilise, il ne faut pas utiliser la proprit Text.
NavigateUrl est ladresse destination.
<asp:Hyperlink Text="Rubrique Enseignement"
NavigateUrl="http://enseignement.com" runat="server"/>
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 22 22
Panel (volet)
Le panneau contient dautres composants ASP.NET.
Sert afficher ou cacher un groupe de composants.
Exemple: dsactiver des composants laide de lImageButton.
Sils sont dj dsactivs, ils seront ractivs.
Proprits :
BackImageUrl qui est limage de fond.
HorizontalAlign qui est lalignement du contenu du volet (Center,
Justify, Left, NotSet ou Right).
void ibClick(Object Sender, ImageClickEventArgs E)
{
pTout.Enabled=!(pTout.Enabled);
}
avec :
<asp:Panel id="pTout" runat="server">

</asp:Panel>
12
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 23 23
Calendrier complet prt lemploi.
Proprits principales :
VisibleDate est la date visible (de type DateTime).
Calendar (calendrier)
<head>
</head>
<body>
<form runat="server">
<asp:Calendar VisibleDate="2008/05/11" runat="server"/>
</form>
</body>
<!Affiche le calendrier du mois de mai 2008>
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 24 24
Le passage darguments
Le passage darguments
13
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 25 25
<%@ Page Language="C#" %>
<script runat="server">

</script>
<html>
<head>
</head>
<body>
<form runat="server">
Login:
<asp:TextBox id="TbLogin" Runat="server"/>
<br />
Passwd:
<asp:TextBox id="TbPasswd" TextMode="Password" Runat="server"/>
<br />
<br />
<asp:Button id="BuLogin" onclick="Check" Runat="server"
Text="Login!"/>
</form>
</body>
</html>
Exemple de la saisie du login/password
Mapage.aspx
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 26 26
Passage d'arguments une url
http://monsite.com/MesInfos.aspx?param1=val1&param2=val2.
Cette syntaxe est utilise dans le traitement du clic sur le bouton de
login. MesInfos.aspx est excute avec les paramtres fournis:
<%@ Page Language="C#" %>
<script runat="server">
public void Check(object sender, EventArgs e)
{ string[,] tab= {
{"Toto", "aspnet"},
{"Test", "Test"}
};
int i=0;
while (i<tab.Length/2) // Nb total d'elements / nombre de dimensions...
{
if (TbLogin.Text == tab[i,0].ToString() &&
TbPasswd.Text == tab[i,1].ToString())
Response.Redirect("MesInfos.aspx?L=" + TbLogin.Text
+ "&P=" + TbPasswd.Text);
i++; }
Response.Redirect("MesInfos.aspx");
}
</script>
14
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 27 27
<html>
<head>
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
La.Text = "Nous sommes passs par le Page_Load() pour vrification";
if (Request.Params["L"]!=null)
La.Text += "<br>Login: " + Request.Params["L"].ToString();
if (Request.Params["P"]!=null)
La.Text += "<br>Pass: " + Request.Params["P"].ToString();
}
</script>
</head>
<body>
<form runat="server"> Page MesInfos<br><br>
<asp:Label Runat=server ID=La></asp:Label>
</form>
</body>
</html>
Passage d'arguments une url
MesInfos.aspx
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 28 28
Request.Params() : permet de vrifier que les variables existent bien
et qu'elles sont initialises.
Inconvnient : faire passer chaque page le login et le mot de passe.
Une solution: les variables session.
Passage d'arguments une url
15
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 29 29
Les variables session
Les variables session sont stockes sur le serveur.
Si trop de variables alors faibles performances du serveur.
Variables accessibles du dbut jusqu' la fin de la session du navigateur
(fermture de la session ou inactivit du navigateur pendant un timeout).
Une session est un espace mmoire/disque sur le serveur associ un
et un seul utilisateur/navigateur.
Une session possde un identifiant unique stock au niveau du navigateur
Les variables session sont stokes sur le serveur et sont accesssibles par
toutes les pages Web associes cette session.
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 30 30
public void Check(object sender, EventArgs e)
{
string[,] tab= {
{"Toto", "aspnet"},
{"Test", "Test"}
};
int i=0;
while (i<tab.Length/2) // Nb total d'elements / nombre de dimensions...
{
if (TbLogin.Text==tab[i,0].ToString() &&
TbPasswd.Text==tab[i,1].ToString())
{
Session["Username"] = TbLogin.Text;
break;
}
i++;
}
Response.Redirect("MesInfos2.aspx");
}
Exemple
16
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 31 31
Et pour la page dinformation :
Exemple
void Page_Load(object sender, EventArgs e)
{
La.Text = "Nous sommes passs par le Page_Load() pour
vrification";
if (Session["Username"]!=null)
La.Text += "<br>Login: " + Session["Username"].ToString();
else
La.Text + = "<br>Personne n'est connect";
}
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 32 32
Les variables d'application
Les variables d'application sont accessibles par toutes les sessions
Exemple courant : comptabiliser le nombre dutilisateurs connects
Il faut ajouter dans la fonction Check() :
if (Application["NbUsers"]!=null)
Application["NbUsers"]=
Convert.ToInt32(Application["NbUsers"])+1;
else
Application["NbUsers"] = 1;
17
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 33 33
Dans la page dinformations, il faut rcuprer cette valeur laide de la
syntaxe utilise pour les variables de session.
Les variables d'application
if (Application["NbUsers"]!=null)
La.Text += "<br>NbUsers: " +
Application["NbUsers"].ToString();
else
La.Text += "<br>NbUsers: 0!";
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 34 34
Les Web Services
Les Web Services
18
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 35 35
Architecture des Services Web
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 36 36
Il faut connatre l'adresse Web du WebService
(par ex. le Service Web http://ws.soatrader.com/delimiterbob.com/0.1/YellowPages?WSDL du site
http://www.xmethods.com/ qui contient des WebServices quon peut tester en ligne).
Une fois l'adresse du WebService trouve, choisir le menu References et choisir
"Ajouter une rfrence Web".
On arrive sur l'cran qui permet la saisie de l'adresse du WebService,
Il faut cliquer sur le bouton "Aller ".
Une barre de progression qui s'affiche permet de rcuprer la liste
des mthodes disponibles.
Il faut juste cliquer sur le bouton "Ajouter la rfrence" pour pouvoir
ajouter ce WebService en tant que rfrence ce projet.
Si la rfrence est correctement ajoute, elle devient visible dans l'explorateur
de solutions.
Comment ajouter une rfrence Web dans son projet ?
Sous Visual Studio Express 2008
19
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 37 37
Les Services Web :
sont des fonctions stockes sur un serveur Web
et mises la disposition de tout le monde.
ressemblent des classes classiques.
sont bass sur des protocoles tels que XML et SOAP transports
par les protocoles http ou https.
Le framework .NET gnre lui-mme les en-ttes SOAP et XML.
Les Services Web
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 38 38
Chaque service web est identifi par un contrat WSDL.
Ce contrat reprsente la structure SOAP/XML du Service Web.
Il est ncessaire de faire rfrence au contrat WSDL du Service Web
si on dsire le consommer.
Le contrat WSDL est visible
* soit en cliquant sur le lien "Service description"
* soit en ajoutant "?WSDL" la fin de l'url o se trouve le Service Web.
Le contrat WSDL
20
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 39 39
Pour consommer un Service Web :
- il faut connatre son emplacement
- il faut obtenir son contrat WSDL ncessaire la cration d'une classe proxy
utiliser par le consommateur.
Pour gnrer la classe proxy, il suffit d'utiliser la commande wsdl :
wsdl url_du_service_web?WSDL /out:lenomdelaclasseproxy.cs
On peut ajouter ce fichier source notre projet o en faire une dll
rajouter en tant que rfrence dans le projet.
Pour crer cette DLL, on peut utiliser l'utilitaire :
csc /target:library lenomdelaclasseproxy.cs
Consommation dun Service Web
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 40 40
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
public class Exemple : System.Web.Services.WebService {
[WebMethod] /*Cet attribut spcifie que la mthode est
utilisable par une application cliente d'un service Web*/
public int Additionne(int a, int b) {
return a + b;
}
}
Exemple de ServiceWeb
L'attribut [WebMethod] permet de rendre une mthode accessible
aux consommateurs des services web. Le rsultat du ServiceWeb est retourn
au format XML. Ajouter le fichier source petitExemple.cs ou la dll
petitExemple.dll au projet.
21
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 41 41
Pour gnrer la classe proxy, il suffit d'utiliser la commande wsdl :
wsdl url_du_service_web?WSDL /out:lenomdelaclasseproxy.cs
Dans MicroSoft Visual Studio 8, lancer lutilitaire wsdl qui
se trouve dans :
$cd <Rep>\SDK\v2.0\Bin si <Rep> est le rpertoire dinstallation
$wsdl http://localhost:1178/WebSite1/Service.asmx?wsdl /out:MonService.cs
criture du fichier <Rep>\SDK\v2.0\Bin\MonService.cs
On peut rajouter ce fichier source notre projet o en faire une dll
rajouter en tant que rfrence dans le projet.
Pour crer cette DLL, on peut utiliser l'utilitaire sil est disponible:
csc /target:library lenomdelaclasseproxy.cs
Gnration du proxy
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 42 42
<@ Page="c#" Codebehind="Program.aspx.cs"
AutoEventWireup="true"
Inherits="Program.Consommateur" >
<HTML>
<body MS="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Label id="rep_webservice" runat="server">Label</asp:Label>
</form>
</body>
</HTML>
Exemple de page ASP.NET
Cette page ASP.NET contient un contrle label qui recevra la rponse
du Service Web.
22
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 43 43
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public class Consommateur : System.Web.UI.Page {
protected System.Web.UI.WebControls.Label rep_webservice;
private void Page_Load(object sender, System.EventArgs e) {
/*On instancie le service web*/
Exemple petitExemple = new Exemple();
/*On appelle la mthode "additionne" qui retournera "15"*/
rep_webservice.Text=petitExemple.Additionne(5,10).ToString();
}
}
Le programme Program.aspx.cs
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 44 44
Les attributs de WebMethod
[WebMethod (EnableSession=true)] : permet lusage de sessions
Par dfaut, l'attribut EnableSession est false,
Le consommateur doit accepter les cookies.
[WebMethod (BufferResponse=false)] : gal true par dfaut
Lorsque l'on dfinit cet attribut false, le service web envoie sa rponse
au fur et mesure qu'il la srialise, pas de stockage pralable dans un tampon.
Si cet attribut est false, les en-ttes SOAP sont dsactives et de ce fait,
certains objets complexes ne peuvent plus tre vhiculs
vers le consommateur/service.
23
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 45 45
[WebMethod (CacheDuration=nombre de secondes)]
Par dfaut, aucune rtention de donnes en cache n'est effectue.
On peut changer ce comportement en disant au service web de garder
les rponses en cache pendant un certain temps.
[WebMethod (Description="une description")]
[WebMethod (MessageName="alias nom de mthode")]
Si cet attribut nexiste pas cest le nom de la mthode elle-mme qui sera utilis.
Les attributs de WebMethod
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 46 46
[WebMethod (TransactionOption=TransactionOption.[Disabled ou
Required ou Supported ou NotSupported ou RequiresNew])]
Disabled: les transactions sont dsactives
Required: les transactions sont obligatoires, l'appel la mthode
du service doit tre au sein d'une transaction
Supported: les transactions sont supportes
NotSupported: les transactions ne sont pas supportes
RequiresNew: chaque mthode doit dmarrer une transaction
Les attributs de WebMethod
24
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 47 47
Par dfaut les appels sont synchrones
Une classe proxy est cre pour un service web laide de l'outil wsdl
pour travailler avec les mthodes synchrones et asynchrones.
Les mthodes synchrones portent le mme nom que les mthodes
du service Web.
Les mthodes asynchrones sont par contre prfixes :
Begin<nom de la mthode du service> dmarre la communication
asynchrone
End<nom de la mthode du service> reoit la rponse de la mthode
en fin de commumnication
Les appels asynchrones
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 48 48
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public class Consommateur : System.Web.UI.Page {
protected System.Web.UI.WebControls.Label reponse_webservice;
private Exemple petitExemple = new Exemple();
private void Page_Load(object sender, System.EventArgs e) {
//Dclaration d'un objet rsultat d'appel asynchrone et
dmarrage asynchrone de l'appel*/
IAsyncResult Reponse = petitExemple.BeginAdditionne(10,15,null,
null); Response.Write("Le traitement continue");
/* Ici on bloque l'excution du code jusqu' ce que la rponse de l'appel
asynchrone ait t obtenue */
Reponse.AsyncWaitHandle.WaitOne();
/*Ici on rcupre la rponse --> 25*/
rep_webservice.Text=petitExemple.EndAdditionne(
Reponse).ToString(); } } }
Exemple
25
samia.bouzefrane@cnam.fr - CEDRIC ( CNAM) - 49 49
Bibliographie Bibliographie
Pratique de .NET2 et C#2, Patrick Pratique de .NET2 et C#2, Patrick Smacchia Smacchia, , Ed Ed. . Oreilly Oreilly, 2005. , 2005.
//ditch.developpez.com/ par //ditch.developpez.com/ par Didier Danse Didier Danse
msdn.microsoft.com msdn.microsoft.com
Apprentissage du Langage C#, par Serge Apprentissage du Langage C#, par Serge Tah Tah , ISTIA, Universit , ISTIA, Universit
d d Angers Angers
Cr Cr er et Consommer un service web avec .NET er et Consommer un service web avec .NET , Par , Par St St phane phane
Eyskens Eyskens. .
Visual Visual Studio 2008 (versions Express gratuites) Studio 2008 (versions Express gratuites)
http:// http://www.microsoft.com www.microsoft.com/express/ /express/

You might also like