Singleton .Net / Mono (Service / Server?) En C # - détectez si mon application .net est déjà en cours d'exécution et transmettez-lui des arguments de ligne de commande

StackOverflow https://stackoverflow.com/questions/810181

  •  03-07-2019
  •  | 
  •  

Question

J'aimerais créer une application de ligne de commande singleton simple (un service?) en C # qui, lorsqu'elle était exécutée, vérifiait si elle était déjà en cours d'exécution et, le cas échéant, passait les arguments de ligne de commande au déjà en cours d'exécution et fermé lui-même. Désormais, dans l'instance en cours d'exécution, il recevrait les arguments de la ligne de commande par le biais d'un événement tel que "delegate void Command (string [] args)"; ou quelque chose comme ça, donc je peux gérer la ligne de commande à travers une application via des événements.

Par exemple, dans photoshop, lorsque vous ouvrez une image pour la première fois, il charge une nouvelle instance photoshop, mais lorsque vous ouvrez une seconde image, il vérifie si une instance de photoshop est déjà en cours d'exécution et , il passe l'image à l'instance déjà chargée de photoshop afin d'éviter de nouveau le temps de chargement coûteux de photoshop ...

Ou dans le navigateur Web, vous pouvez le configurer pour que, si vous ouvrez un nouveau fichier .html, il l'ouvre dans un nouvel onglet et non dans une nouvelle instance de fenêtre.

ou de nombreux éditeurs de texte ont des paramètres pour autoriser l’ouverture d’une seule instance de l’éditeur de texte et lorsqu’un nouveau fichier est ouvert, il est chargé dans un nouvel onglet, pas dans une nouvelle fenêtre ...

beaucoup de lecteurs de musique comme winamp le font aussi ...

Je vais éventuellement configurer cela en tant que service. Il devrait donc être constamment à l'écoute des arguments de ligne de commande plus tard, mais pour le moment, c'est principalement pour que je puisse gérer l'ouverture de fichiers d'un type spécifique à la fois. application singleton, ou demandez à d’autres applications de passer les arguments de ligne de commande des fichiers qu’elles veulent ouvrir ...

En outre, si vous connaissez une meilleure façon ou une API en .Net de rediriger tous les arguments de ligne de commande passés, vers un événement d'un service toujours en cours d'exécution, je peux travailler avec cela ... mais je ' d souhaite également conserver cette multiplateforme pour pouvoir fonctionner sous Linux / Mac sous Mono si cela est possible, sans avoir à gérer deux ou plusieurs bases de code ...

Était-ce utile?

La solution

Cet article a été utilisé pour implémenter la fonctionnalité exacte que vous recherchez. Il vous permet également de transférer des arguments en ligne de commande.

Application C # à instance unique - pour .NET 2.0

Autres conseils

Nous avons fait quelque chose de similaire en utilisant bien que pour un but très différent en utilisant .net remoting sur le framework 1.0 / 1.1. En gros, nous utilisions un sémaphore pour nous assurer que nous étions la seule instance en cours d'exécution. Vous souhaiterez cibler l’espace de noms global si vous souhaitez n’avoir qu’une instance par machine ou le local si vous en souhaitez une par session utilisateur (dans les scénarios de service terminal et de changement rapide d’utilisateur).

Si vous pouvez verrouiller le semphore, vous allez configurer la communication à distance et commencer à écouter les événements, puis continuer avec votre code.

si vous ne pouvez pas verrouiller, vous pouvez alors supposer que vous avez une autre instance en cours d'exécution. Dans ce cas, vous ouvrez un canal distant pour que l'autre instance passe les arguments et arrête.

Vous pouvez essayer d’utiliser un mutex nommé (le nommer permettra de l’identifier à l’échelle du système et de le rendre facilement identifiable). Avec le mutex, vous pouvez soit exécuter l'instance (s'il n'existe pas de mutex portant le nom), ou vous pouvez ouvrir l'instance existante et transmettre vos paramètres. Toutes mes excuses pour mon exemple de code, écrit sur mon téléphone.

Édition: nvrmnd. Il suffit de relire le message et je ne pense pas que cela fonctionnera pour vous lorsque vous passerez d’une plate-forme à une autre.

Visual Basic intègre cette fonctionnalité. Regardez:

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase - Evénement public StartupNextInstance

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top