2009-07-09 5 views
9

Lorsque je développe une application de console C# (qui s'exécutera sur un serveur) et que je l'exécute à l'aide de Visual Studio, j'obtiens un message "Appuyez sur n'importe quelle touche pour continuer" avant la fin du programme.Comment VS compile-t-il les applications de la console pour afficher "Appuyez sur une touche pour continuer"?

Cependant, lorsque je compile manuellement le même fichier de code C# en utilisant CSC, mon programme n'affiche pas ce message et il se termine immédiatement après avoir terminé sa logique.

Est-ce que quelqu'un sait comment je peux faire la même fonctionnalité lors de la compilation du code sans utiliser VS et SANS changer le code C# l'ajout d'une ReadLine()?

MISE À JOUR: Le même message utilisé pour apparaître quand j'ai appris C#, je l'habitude d'utiliser TextPad avec le SCC, et ce message utilisé pour apparaître sans ajouter de Write (ligne)/Read (ligne) Callings

+0

Cette [link] (http://stackoverflow.com/q/4834914/944628) fonctionne pour moi avec les touches Ctrl + F5. J'utilise Visual Studio 2010. – leonardo

Répondre

7

Vous pouvez écrire un script batch qui exécute l'exe pour vous et invite l'utilisateur à appuyer sur une touche.

Le script batch ressemblerait à quelque chose comme ceci:

echo off 
YourApp.exe 
pause 
+0

Merci, TextPad génère automatiquement les fichiers batch. –

+2

Je suggérerais plutôt la réponse de Chalkey. –

14

Ce n'est pas possible. L'invite à appuyer sur une touche est générée par Visual Studio lors de l'exécution d'une application de console. Cela ne fait pas partie de votre programme.

La seule façon est à l'aide Console.Read() dans votre code

MISE À JOUR: en ce qui concerne votre remarque sur l'utilisation TextPad: Je ne suis pas familier avec TextPad, mais je ne serais pas surpris si TextPad fait la même chose que Visual Studio lors de l'exécution d'une application de console.

+0

vous pouvez ajouter la ligne Console.Read() et le commenter lors de la livraison. Cependant, la meilleure approche que je connaisse est d'utiliser la journalisation et de consigner toutes les informations dont vous avez besoin à un niveau inférieur tel que Info ou Trace ou Debug et de le désapprouver lors de l'expédition :-) –

+0

Veuillez voir ma mise à jour ci-dessus. –

+0

OK, merci. En ce qui concerne votre mise à jour, comme je l'ai mentionné dans mon commentaire sur la réponse d'Andrew, TextPad génère automatiquement des fichiers batch pour y parvenir. –

2

Ce comportement n'a rien à voir avec le compilateur que vous utilisez. Lorsque vous compilez avec Visual Studio, l'exécution de l'exécutable en dehors de Visual Studio fonctionnera exactement comme lorsque vous compilez avec CSC sur la ligne de commande. Visual Studio (et TextPad) ajoute la logique pour ajouter le message "Appuyez sur une touche pour continuer" sur la console.

Si vous voulez que votre application reste ouverte, vous devrez faire quelque chose comme Console.ReadLine() pour bloquer l'exécution afin que votre application ne termine pas son exécution.

22

Il n'a rien à voir avec le compilateur - si vous appuyez sur F5 pour déboguer plutôt que Ctrl-F5 pour exécuter sans débogage, puis VS ne montre pas l'invite. C'est vraisemblablement pour que vous ne manquiez pas la production qu'elle produit.

Pour ce faire, exécute Visual Studio cmd.exe dire pour exécuter votre exécutable puis pause:

"C:\WINDOWS\system32\cmd.exe" /c ""...\ConsoleApplication1.exe" & pause" 

Il ne probablement pas le faire lors du débogage comme il est un peu plus difficile à obtenir l'ID de processus d'un enfant d'un processus enfant. Pour ajouter une option similaire à votre programme, utilisez un commutateur de ligne de commande pour indiquer à l'application de mettre en pause ou d'utiliser un fichier batch pour l'exécuter, puis de mettre en pause ou d'utiliser un raccourci cmd.exe /c.

8

Vous pourriez le faire ...Ainsi, le programme n'attendra pas l'entrée de la console lorsque vous créez votre application en tant que 'Release'.

+0

Naoooo, cela provoquera des raccrochements à moins que quelqu'un ne pense à ajouter une entrée piped avant de démarrer le script. par exemple. 'echo y | script.exe' pour garder de la flexibilité, il vaut mieux garder la pause en dehors du programme. –

1

La question est: pourquoi voudriez-vous avoir ce comportement? La pression sur n'importe quelle touche pour continuer la fonction est là pour que vous puissiez voir la sortie de votre application. Si, d'un autre côté, vous construisez votre code et que vous le lancez à partir d'une invite de commande (console), il ne se fermera pas à la fin de l'application, vous pouvez donc voir la sortie.

Comme indiqué ci-dessus, Appuyez sur n'importe quelle touche pour continuer est une fonctionnalité de l'EDI et non liée au code que vous écrivez. Le but de cette fonctionnalité est de vous permettre de voir la sortie de votre application console.

2

Vous pourriez faire ceci, si vous voulez la même fonctionnalité lors du débogage.

if (Debugger.IsAttached) 
{ 
    Console.WriteLine("Press any key to continue . . ."); 
    Console.ReadKey(true); 
} 
+0

qui ne respecte ni c14n ni i11n. –

+0

Il n'y a aucun moyen d'effectuer i11n à ce sujet, car les chaînes de ressources, utilisées par Visual Studio, ne sont pas facilement disponibles. Je ne suis pas vraiment sûr de ce que vous voulez dire avec c14n, cela ne semble pas pertinent à la question posée. – Siewers

+0

Il n'est pas canonisé (c14n) car vous reproduisez une fonctionnalité qui existe déjà (pause). mais je n'ai pas downvote car j'utilise aussi cette technique moi-même. Parfois, nous ne voulons pas nous préoccuper de la merde. Si ça fait assez le boulot. –

Questions connexes