Malheureusement, vous ne pouvez pas utiliser Process.Start() pour démarrer une instance du processus en cours d'exécution. Selon la documentation de Process.Start() : "Si le processus est déjà en cours d'exécution, aucune ressource de processus supplémentaire n'est démarrée..."
Cette technique fonctionnera parfaitement sous le débogueur VS (parce que VS fait une sorte de magie qui fait croire à Process.Start que le processus n'est pas déjà en cours d'exécution), mais échouera si elle n'est pas exécutée sous le débogueur. (Notez que cela peut être spécifique au système d'exploitation - je crois me souvenir que dans certains de mes tests, cela a fonctionné sous XP ou Vista, mais je me souviens peut-être seulement de l'avoir exécuté sous le débogueur).
Cette technique est exactement celle utilisée par le dernier programmeur du projet sur lequel je travaille actuellement, et j'essaie de trouver une solution de contournement depuis un certain temps. Jusqu'à présent, je n'ai trouvé qu'une seule solution, qui me semble sale et peu pratique : lancer une deuxième application, qui attend en arrière-plan que la première application se termine, puis relance la première application. Je suis sûr que ça pourrait fonctionner, mais, beurk.
Edit : Utiliser une 2ème application fonctionne. Tout ce que j'ai fait dans la seconde application était :
static void RestartApp(int pid, string applicationName )
{
// Wait for the process to terminate
Process process = null;
try
{
process = Process.GetProcessById(pid);
process.WaitForExit(1000);
}
catch (ArgumentException ex)
{
// ArgumentException to indicate that the
// process doesn't exist? LAME!!
}
Process.Start(applicationName, "");
}
(Il s'agit d'un exemple très simplifié. Le vrai code comporte de nombreux contrôles d'intégrité, de gestion des erreurs, etc.)
3 votes
Je suis curieux de savoir s'il faut redémarrer votre application. Je n'ai jamais pensé à ce besoin auparavant. Quelles sont vos circonstances ?
1 votes
Notre cas particulier : une application de lecteur multimédia qui est censée faire tourner en boucle des images et du contenu flash. Elle doit fonctionner pendant des jours et des jours sans redémarrage de la machine, et il n'y a pas de clavier/souris, donc aucune interaction avec l'utilisateur. Si le programme se bloque (exception non gérée), il doit redémarrer le programme, et non sortir ou afficher une erreur. stackoverflow.com/questions/773768/ C'est la raison pour laquelle le programme continue d'avoir des exceptions que je ne peux pas empêcher. :(
2 votes
Finalement, une solution bien meilleure pour notre application a été de développer une petite application Watchdog qui est lancée (si elle n'est pas déjà en cours d'exécution) à partir de l'application principale. Le chien de garde vérifie simplement toutes les 10 secondes environ si l'application principale a encore un processus en cours d'exécution, et si ce n'est pas le cas, il en démarre un. Simple, élégant, et beaucoup plus robuste que d'essayer de redémarrer à partir de l'application principale.
4 votes
Un autre motif de redémarrage est le changement de langue ou le téléchargement d'une mise à jour.
1 votes
Mais que se passe-t-il si... L'application chien de garde se plante ?
0 votes
@Metoniem Je suppose que vous pourriez faire en sorte que votre application principale surveille cette condition et la redémarre. Une sorte de relation symbiotique. En réalité, cependant, votre application de surveillance devrait être si simple que ses chances de planter (ou d'être fermée accidentellement ?) sont beaucoup, beaucoup plus faibles.
0 votes
@AdamNofsinger Oh oui, ça marcherait probablement ! Cool :)
0 votes
Certains logiciels malveillants/espions utilisent une paire de programmes qui se surveillent mutuellement et/ou des entrées de registre pour rester en activité. Ils peuvent être difficiles à tuer...