Au fil des flows

27fév/121

Lancer une instance d’application une seule fois sous Windows en C#

Dans certain cas, par exemple quand l'application est liée à une base de donnée fixe, on ne veut pas que l'utilisateur puisse lancer plusieurs instances de l'application.

Il existe de nombreuses solutions possibles. L'une des plus simple est de s'appuyer sur le mécanisme de Mutex.

Qu'est ce qu'un mutex ?

Un mutex est une primitive qui permet de synchroniser des processus entre eux. Il s'agit d'un objet du Kernel Windows qui est encapsulé par le frameworks dotNet au travers de la classe Mutex.

Un mutex peut etre identifié par une clée au niveau de l'OS. C'est sur ce principe qu'on s'appuiera.

L'idée est simple. La première application qui se lance crée le mutex avec comme clef, le nom de l'application et se déclare ainsi propriétaire. Si une seconde application se lance, le mutex existera déjà. Dans ce cas, on affiche un message d'erreur.

Voici un exemple de code permettant de faire ça :

namespace Eurosonic.ExempleApplication
{
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Windows.Forms;
    using Eurosonic.ExempleApplication.Properties;
    using System.Threading;

    public static class Program
    {
        static Mutex mutex;

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        public static void Main()
        {
            // Chargement du gestionnaire d'erreur standart
            string application_name = Path.GetFileName(Application.ExecutablePath);
            try
            {
                Program.mutex = Mutex.OpenExisting(application_name);
                MessageBox.Show(String.Format("L'application {0} est déjà lancée.", application_name), "Avertissement", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch
            {
                Program.mutex = new Mutex(true, application_name);
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form_MdiMain());
            }
        }
    }
}

J'ai stocké le mutex en static sinon, ce code ne fonctionnait pas. Je pense que mon application déréférençait le mutex juste après l'avoir réservé. Le garbage collector faisant le reste. Cependant je n'ai pas poussé les investigations plus en avants.

Si vous avez une explication plus convaincante, je suis preneur. N'hésitez pas à poster un commentaire.

Les limites

Cette solution pour protéger une ressource est loin d'être parfaite. Dans notre cas nous l'avons simplement jugé suffisante. Cependant si vous lancez une instance de l'application depuis un autre ordinateur sur le meme fichier ressource au travers du réseau par exemple, celui ci ne sera pas protégé. La limite tient au fait que l'OS ne peut protéger que ce qu'il contrôle.

Posted by Fabien Arcellier

Remplis sous: Non classé Laisser un commentaire
Commentaires (1) Trackbacks (0)
  1. I all the timke mailed this website powt page to all my
    contacts, as if like to read it afterward my friends will too.


Leave a comment

Aucun trackbacks pour l'instant