Comment détecter une application non gérée a été abandonnée
-
20-08-2019 - |
Question
J'ai une application C # qui appelle une application C ++ non gérée via Process.Start ()
Sur certaines machines, si cette application C ++ est abandonnée, la boîte de dialogue d'erreur Just-In-Time qui s'affiche me laisse
Existe-t-il un moyen de C # de détecter que l'application C ++ est erronée et de la redémarrer simplement
(Je n'ai pas le source et ne peux donc pas modifier l'application C ++)
La solution
La boîte de dialogue du débogueur JIT s'affiche, car l'application C ++ est tombée en panne. Alors que le dialogue est ouvert, le processus est toujours présent (mais suspendu), ce qui signifie que la classe Process ne considérera pas qu'elle ait & "Sortie &"; jusqu'à ce que le dialogue JIT soit fermé ou qu'un débogueur attaché mette fin au processus.
Vous pouvez désactiver le débogage JIT sur les ordinateurs rencontrant le problème (je pense que le fait de désactiver le service Machine Debug Manager peut désactiver le débogage JIT), ce qui permet à l'application de se bloquer et de mourir (et, par conséquent, signalez comme " quitté "), ou (et je ne sais pas comment vous allez procéder), voyez si vous pouvez obliger votre application C # hôte à se joindre en tant que débogueur pour l'application C ++ et recevoir une notification du blocage de l'application C ++, y mettre fin, puis agir en fonction des informations terminées.
Autres conseils
Si le C ++ est une console, vous pouvez vérifier deux choses,
-
Le code de sortie, généralement 0, signifie normalement fermé sinon le problème (mais je pense que cela dépend de la convention utilisée pour développer cette application)
-
Vérifiez l'erreur standard si elle est vide pour que tout se passe bien
using (Process p = new Process ()) {
p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.FileName = "any.exe"; p.Start(); string error = p.StandardError.ReadToEnd(); p.WaitForExit() if(error.Length == 0 && p.ExitCode == 0) { } }