IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Verifier si une instance de l'application existe


Sujet :

C#

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Verifier si une instance de l'application existe
    Bonjour

    Je recherche la meilleure et plus simple maniere de verifier si une instance d'APP .NET est déja chargée

    J'avoue qu'en cherchant sur Google j'e trouverais sans doute une reponse a cette question mais je me permet ce post car j'aime vraiment tout sur developez (ses membres, sa structure, sa presentation,etc.) SAUF le systeme de recherche

    Il est généralement plus facile de trouvez des sujet sur developpez via google que par la recherche interne du site et je trouve cela tres dommage !!

    Je vais d'ailleurs retapper sur le clou dans un autre post car dans le meme contexte je me documente aussi sur des idées d'execution de Splash screen !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Salut,

    J'en connais personnellemennt deux:
    - soit utiliser la classe Process afin de savoir si le process en cours est déjà est déjà lançé.
    - soit en dérivant de Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase (assembly du runtime VB). Le plus de cette méthode c'est que c'est mieux intégré au système, et qu'il est possible d'avoir un event lors du "relancement" de l'application pour savoir ce qu'il faut faire (par exemple comme dans word).

    Bon courage,

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    Salut,

    Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase (assembly du runtime VB).
    Bon courage,
    Merci mais sans chercher trop loin tu me parle d'un runtime VB alors que je suis avec .NET et cSharp, donc je me demande si c'est une bonne voie ?

    J'ai aussi pensé au Mutex ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Oui je te parles de runtime VB. Le plus surprenant c'est que j'ai enendu parler de ça dans un livre sur WPF... Il est facilement possible de l'intégrer en prérequis d'un installeur. Ton appli ne subira pas de pertes de perfs non plus.

    Il existe aussi le Mutex, c'est vrai. Mais un peu comme le Process, c'est une méthode simple mais qui ne permet pas de logique : ça marche ou pas. Après cela dépend des besoins. Si comme dans un Word, tu dois afficher le document sur lequel tu clic, en réutilisant l'instance Word existante, il vaut mieux utiliser la méthode du runtime VB.
    Il est aussi possible de faire çà avec du Remoting, ou via un service WCF auto-hébergé, mais oublions vite, car c'est lourd ...

  5. #5
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    J'utilise perso le Mutex et ça fonctionne très bien donc je ne vois pas le problème...

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par sisqo60 Voir le message
    J'utilise perso le Mutex et ça fonctionne très bien donc je ne vois pas le problème...
    Process offre un peu plus de possibilité

    Par contre l'idée de l'event de cybermaxs me plait !
    Cependant le fait que l'on doive utiliser une dll VB m'a completement refroidi
    J'ai pas bien analysé ce truc mais il y a quelque chose que n'ai n'ai pas encore capté a ce sujet

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Un bon lien valant mieux qu'un long discours...

    Par contre, comme évoqué plus haut, j'ai rencontré cette classe pour la première fois dans un livre sur WPF il y a peu. Après quelques recherches, il semble que le runtine VB ne soit pas requis. Il faut juste une référence à Microsoft.VisualBasic.dll, qui est incluse depuis .Net 2.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    Il est aussi possible de faire çà avec du Remoting, ou via un service WCF auto-hébergé, mais oublions vite, car c'est lourd ...
    Justement, je crois que WindowsFormsApplicationBase utilise le remoting... une fois je suis tombé sur une erreur bizarre en utilisant cette classe, et le message d'erreur semblait lié au remoting

    C'est vrai que cette classe est bien pratique, et je ne vois vraiment pas pourquoi ils l'ont mise dans un assembly spécifique à VB.NET alors qu'elle serait tout aussi utile en C#... (je me pose d'ailleurs la même question pour pas mal d'autres classes de l'assembly Microsoft.VisualBasic...)

    Evidemment, ça empêche pas de l'utiliser en C#, mais ça me fait toujours grincer des dents de référencer un assembly qui s'appelle Microsoft.VisualBasic

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Citation Envoyé par tomlev Voir le message

    Evidemment, ça empêche pas de l'utiliser en C#, mais ça me fait toujours grincer des dents de référencer un assembly qui s'appelle Microsoft.VisualBasic
    tu m'étonnes ! sans lancer de polémique, ça me donne l'impression de reculer d'un cran ou deux.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    A mon avis, l'isolation par Mutex est la plus sécurisée, c'est un appel système fort (c'est blocant), donc ca garanti bien une seule instance. Je pense que c'est la "bonne pratique".

    Cette solution marche sous Citrix & MS server, sans probleme sur de la multisession (l'astuce optimale étant de concaténer dynamiquement le numéro de session avec le nom du mutex afin de le rendre vraiment unique). Tu peux aussi mettre un Mutex au niveau système, pour qu'il n'y ai qu'une seule instance sur toute les sessions // à vérifier pour les droits & co


    La solution de lister les process, est beaucoup moins certaine (probleme d'appel concurrent ) et pas vraiment élégante. Je ne vois pas dans quel cas, elle peut servir, ou être plus souple, mais c'est une solution envisageable, sans doute pas la "best practice" en tout cas.

    A+

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par alavoler Voir le message
    A mon avis, l'isolation par Mutex est la plus sécurisée, c'est un appel système fort (c'est blocant), donc ca garanti bien une seule instance. Je pense que c'est la "bonne pratique".
    Peut-être, mais ça ne fournit aucun moyen d'activer l'instance existante de l'application et de lui transmettre des paramètres...

    WindowsFormsApplicationBase se base sur des évènements nommés (EventWaitHandle), ce qui est tout aussi fiable que d'utiliser un Mutex, et gère l'appel à l'instance existante.

    @cybermaxs : tu dis que tu avais vu ça dans un bouquin sur WPF, mais je ne vois pas comment on pourrait utiliser ça autrement qu'en WinForms (puisqu'il faut spécifier une Form principale). Le bouquin expliquait comment faire ?

  12. #12
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Peut-être, mais ça ne fournit aucun moyen d'activer l'instance existante de l'application et de lui transmettre des paramètres...

    WindowsFormsApplicationBase se base sur des évènements nommés (EventWaitHandle), ce qui est tout aussi fiable que d'utiliser un Mutex, et gère l'appel à l'instance existante.
    +1

    Merci a tous !
    Voici un sujet fort utile et intéressant

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    @cybermaxs : tu dis que tu avais vu ça dans un bouquin sur WPF, mais je ne vois pas comment on pourrait utiliser ça autrement qu'en WinForms (puisqu'il faut spécifier une Form principale). Le bouquin expliquait comment faire ?

    Oui. L'idée est de surcharger OnStartup de WindowsFormsApplicationBase pour appeler une classe dérivée de Application, dans laquelle tu affectes le formulaire principal.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    tomlev
    Hum j'ai sans doute pas tout suivi le file de la discution

    Mais à vue de nez y a 2 besoins bien distinct:
    - Ne lancer qu'une seule fois l'application (au sens utilisateur // car techniquement ce ne sera pas réellement le cas)
    - Communiquer avec une application

    Le premier: on isole l'application avec un Mutex
    Le deuxième: en local, on utilise généralement l'IPC // canal nommé, pour communiquer entre 2 applications, c'est rapide et fiable. Après tu peux tjs utiliser une autre methode avec les Event ou autre...

    Bon jvais relire le post histoire de pas etre à coté de la plaque

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    Oui. L'idée est de surcharger OnStartup de WindowsFormsApplicationBase pour appeler une classe dérivée de Application, dans laquelle tu affectes le formulaire principal.
    Ah ok !
    En fait, après un petit coup de Reflector, il semblerait que ce soit plutôt OnRun (c'est la méthode qui lance la Form de démarrage)
    Merci pour l'info, je crois que je vais me créer une petite classe WpfApplicationBase

Discussions similaires

  1. Ne lancer qu'une instance de l'application
    Par mactwist69 dans le forum C#
    Réponses: 4
    Dernier message: 20/01/2012, 14h55
  2. Réponses: 1
    Dernier message: 27/04/2009, 11h26
  3. Réponses: 3
    Dernier message: 18/01/2008, 16h54
  4. Réponses: 5
    Dernier message: 22/09/2005, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo