C'est quelque chose que j'ai découvert il y a quelques jours à peine, j'ai eu la confirmation que cette question ne se limitait pas à ma machine .
Le moyen le plus simple de le reproduire est de démarrer une application Windows Forms, d'ajouter un bouton et d'écrire ce code:
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("yada");
Environment.Exit(1); // Kaboom!
}
Le programme échoue après l'exécution de l'instruction Exit (). Sur Windows Forms, vous obtenez "Erreur lors de la création de la poignée de fenêtre".
L'activation du débogage non géré montre quelque peu ce qui se passe. La boucle modale COM est en cours d'exécution et permet la remise d'un message WM_PAINT. C'est fatal sur une forme éliminée.
Les seuls faits que j'ai recueillis jusqu'à présent sont:
- Ce n'est pas seulement limité à l'exécution avec le débogueur. Cela échoue également sans un. Plutôt mal aussi, la boîte de dialogue de crash WER apparaît deux fois .
- Cela n'a rien à voir avec le bitness du processus. La couche wow64 est assez notoire, mais une construction AnyCPU plante de la même manière.
- Cela n'a rien à voir avec la version .NET, 4.5 et 3.5 plantent de la même manière.
- Le code de sortie n'a pas d'importance.
- L'appel de Thread.Sleep () avant d'appeler Exit () ne résout pas le problème.
- Cela se produit sur la version 64 bits de Windows 8 et Windows 7 ne semble pas être affecté de la même manière.
- Cela devrait être un comportement relativement nouveau, je n'ai jamais vu cela auparavant. Je ne vois aucune mise à jour pertinente fournie via Windows Update , même si l'historique des mises à jour n'est plus précis sur ma machine.
- C'est un comportement extrêmement cassant. Vous écririez du code comme celui-ci dans un gestionnaire d'événements pour AppDomain.UnhandledException, et il se bloque de la même manière.
Je suis particulièrement intéressé par ce que vous pourriez faire pour éviter ce crash. En particulier, le scénario AppDomain.UnhandledException me laisse perplexe; il n'y a pas beaucoup de façons de terminer un programme .NET. Veuillez noter que l'appel à Application.Exit () ou Form.Close () ne sont pas valides dans un gestionnaire d'événements pour UnhandledException, ils ne sont donc pas des solutions de contournement.
MISE À JOUR: Mehrdad a souligné que le fil de finalisation pourrait faire partie du problème. Je pense que je vois cela et que je vois également des preuves pour le délai de 2 secondes que le CLR donne au thread de finalisation pour terminer l'exécution.
Le finaliseur est dans NativeWindow.ForceExitMessageLoop (). Il y a là une fonction IsWindow () Win32 qui correspond à peu près à l'emplacement du code, offset 0x3c lorsque vous regardez le code machine en mode 32 bits. Il semble que IsWindow () est dans une impasse. Je ne peux pas obtenir une bonne trace de pile pour les éléments internes, cependant, le débogueur pense que l' appel P / Invoke vient de revenir. C'est difficile à expliquer. Si vous pouvez obtenir une meilleure trace de pile, j'adorerais la voir. Mien:
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.ForceExitMessageLoop() + 0x3c bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Finalize() + 0x16 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12() + 0xe bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
Rien au-dessus de l'appel ForceExitMessageLoop, débogueur non géré activé.
This happens on the 64-bit version of Windows 8
Hans l'a dit!
Exit(0)
un peu avec un Win7 64 bits, Changer ExitCode
n'aide pas maintenant à utiliser Process.GetCurrentProcess().Kill()
sans aucun problème cela fonctionne