[C#] Mise à jour automatique

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

ragnarock

Membre actif
Mar 22, 2010
194
0
917
Salut à tous, je vous propose un petit tuto pour réaliser un système de mise à jour automatique pour votre programme en C#


I. Prérequis

- Des bases en C#
- Un FTP
- Un cerveau


II. Tuto

Il y a plusieurs manières pour faire un système de MàJ, mais je vais expliquer celle que j'utilise, qui est pratique parce que l'utilisateur n'a pas besoin d'intervenir dans l'installation.
Cette technique est assez basique, mais elle marche bien. Par contre, telle quelle, elle est limitée et ne supporte surement que la mise à jour des .exe et des .dll.


Donc tout d'abord, au lancement du programme, il faudra vérifier si c'est la dernière version disponible.
Pour ce faire, il faudra télécharger un fichier .txt qui contient les dernières versions et les comparer aux versions actuelles :

tutomaj1.png

private void MainForm_Load(object sender, EventArgs e)
{
//On initialise un nouveau WebClient pour télécharger le fichier
WebClient wClient = new WebClient();

//On dit quel méthode va s'éxecuter à la fin du téléchargement
wClient.DownloadStringCompleted += wClient_DownloadStringCompleted;

//Et on dit au WebClient de télécharger le contenu du .txt
//(Ne vous occupez pas de la méthode QueueUserWorkItem(),
//elle sert juste à éviter que le Thread se bloque quelques secondes)
ThreadPool.QueueUserWorkItem(delegate
{
wClient.DownloadStringAsync(new Uri("http://VotreSite.com/version.txt"));
});
}

Et bah maintenant faut s'occuper de faire la méthode qui va comparer les versions.

Pour ça, il faut savoir que la version d'un programme possède cette forme : X.X.X.X
Par exemple, les versions de WoW : 3.3.5.12340 ou 4.2.0.14480
Mais vous pouvez très bien mettre 1.0.0.0 ou 2.1.0.0

Dans l'exemple, je vais faire comme si j'avais 2 fichiers (l'exe lui-même et une dll) qui peuvent se mettre à jour, donc le contenu du version.txt sur le FTP sera le suivant (une version par ligne) :
X.X.X.X
X.X.X.X


tutomaj2.png

private void wClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{

//On vérifie qu'il n'y a pas eu d'erreurs durant le téléchargement
//Si c'est le cas, on affiche un message d'erreur
if (e.Error != null)
{
MessageBox.Show("Une erreur est survenue durant la vérification des MàJ, veuillez vérifier votre connection internet ou réessayer plus tard.", "Erreur");
return;
}

//Cette variable contient les paramètres qu'il faudra passer au 2ème prog pour qu'il télécharge les bon fichiers
string dlArgs = "";

//On récupère le string téléchargé et on sépare les différentes versions
string[] versions = e.Result.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

//on déclare une nouvelle Version pour chaque fichier
Version vExe = new Version(versions[0]);
Version vDll = new Version(versions[1]);

//On fait pareil, mais pour les versions actuelles
Version vLocalExe = Assembly.GetExecutingAssembly().GetName().Version;
Version vLocalDll = AssemblyName.GetAssemblyName("MaDll.dll").Version;

//Et ensuite faut comparer tout ça
if (vExe.CompareTo(vLocalExe) == 1) //1 veut dire que vExe est un version plus récente
dlArgs += " MonExe.exe";
if (vDll.CompareTo(vLocalDll) == 1)
dlArgs += " MaDll.dll";

//S'il y a une nouvelle version à DL, on envoie tout ça aux 2ème programme
//et on ferme celui-ci pour qu'il puisse être mis à jour
//Par contre, pour fermer la fenêtre, on est obligé de passer par un delegate
//car ce code n'est pas exécuté par le même Thread
if (dlArgs != "")
{
Process.Start("Update.exe", dlArgs);
Action act = this.Close;
this.Invoke(act);
}
}



Et maintenant on passe au 2ème programme, qui lui va télécharger et remplacer les fichiers.
L'avantage d'avoir un autre programme pour télécharger les MàJ, c'est de pouvoir update le programme principal sans que l'utilisateur ait besoin d'intervenir.

Il va fonctionner comme ça :
  1. Lire les arguments pour savoir quoi télécharger
  2. Télécharger ce qu'il faut
  3. Relancer le premier .exe

Je mets juste un exemple de formulaire et le code (commenté), si vous avez besoin de plus d’explications, hésitez pas à demander :


tutomaj4.png


tutomaj3.png

//On déclare les variables qu'on va utiliser plus tard
private int count, total;
private bool finished;
private string[] args = Environment.GetCommandLineArgs();

private void UpdateForm_Shown(object sender, EventArgs e)
{
Application.DoEvents();

//On initialise un WebClient
WebClient wClient = new WebClient();
wClient.DownloadFileCompleted += wClient_DownloadFileCompleted;
wClient.DownloadProgressChanged += wClient_DownloadProgressChanged;

total = args.Length;
lCount.Text = "0/" + total;

//Et on télécharge les fichiers
foreach (string st in args)
{
finished = false;
wClient.DownloadFileAsync(new Uri("http://www.VotreSite.com/" + st), st);

//Pour pas que ça télécharge plusieurs fichiers en même temps,
//on met un while et à la fin du téléchargement on lui dit que
//c'est bon pour que ça télécharge le fichier suivant
while (!finished)
Application.DoEvents();
}
}

private void wClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//On affiche le pourcentage du téléchargement
pbProgess.Value = e.ProgressPercentage;
}

private void wClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
//On luit dit que le téléchargement est fini
finished = true;

//On actualise le label
count++;
lCount.Text = count + "/" + total;

//Et si tout est téléchargé
if (count == total)
{
//On relance l'autre .exe
Process.Start("MonExe.exe");
this.Close();
}
}
 
Last edited:

oli4584

Membre actif
Nov 2, 2010
245
0
922
34
Merci pour ce magnifique tutoriel en C# justement j'en cherchais un je crois que je vais pouvoir faire un jolie programme avec ceci
 

thyc82

Nouveau membre
May 11, 2012
1
0
301
Merci ! super ! c'est exactement ce qu'il me fallait, mille bravo pour ce tuto :)