Avoir la sortie d'une application console dans Visual Studio au lieu de la console

120

Lorsque vous effectuez une application console en Java avec Eclipse, je vois que la sortie est placée dans une zone de texte dans l'EDI lui-même, au lieu d'avoir une console qui apparaît comme dans Visual Studio. Cela est pratique, car même après la fermeture du programme, je peux toujours faire bon usage du texte qui y était écrit, car il ne sera pas effacé tant que je ne le relancerai pas. Est-il possible de réaliser quelque chose comme ça avec Visual Studio? Je sais qu'au lieu de faire

System.Console.WriteLine(str);

Je peux faire

System.Diagnostics.Debug.WriteLine(str);

mais ce n'est pas tout à fait la même chose, car vous obtenez beaucoup de "junk" dans la fenêtre de sortie, comme tous les symboles chargés et autres.

Mieux encore, est-il possible de tout faire dans l'EDI lui-même, lorsque vous exécutez votre application, au lieu de faire fonctionner la console?

dévoré d'elysium
la source
Quelle version de VS utilisez-vous?
Gabe
Avez-vous un volet Résultats des tests?
Gabe
Je ne l'ai jamais remarqué. Je vais le vérifier. Dois-je l'avoir?
dévoré l'elysium

Réponses:

52

Dans la boîte de dialogue Outils -> Options de Visual Studio -> Débogage -> Cochez la case «Rediriger tout le texte de la fenêtre de sortie vers la fenêtre d'exécution».

SharpSteve
la source
68
J'ai coché cette case mais j'obtiens toujours une fenêtre contextuelle de console et rien dans la fenêtre "Sortie" (Debug, Test, Build, ..) ou la "Fenêtre immédiate".
GuiSim
6
@EvenLisle vous devez changer le type d'application en Application Windows comme dans la réponse de stolsvik . L'option mentionnée dans cette réponse était activée par défaut pour moi dans tous les cas.
TooTone
3
Que signifie exactement «Rediriger tout le texte de la fenêtre de sortie vers la fenêtre d'exécution»? Utilisez différents contextes si vous en avez besoin. Je ne sais pas ce qu'est la «fenêtre immédiate».
Xonatron
11
@TooTone La question indique clairement pour une "application console" et la changer pour quelque chose d'autre juste à des fins de débogage, où je ne peux même pas Console.ReadKey () est tout simplement ridicule!
MickyD
1
Fonctionne uniquement avec Debug.WriteLine (), ne fonctionne pas avec Console.WriteLine () :(
Y2i
45

Dans la boîte de dialogue Options de Visual Studio -> Débogage -> Cochez la case «Rediriger tout le texte de la fenêtre de sortie vers la fenêtre d'exécution». Ensuite, allez dans les paramètres de votre projet et changez le type de "Application console" à "Application Windows". À ce stade, Visual Studio n'ouvre plus de fenêtre de console et la sortie est redirigée vers la fenêtre de sortie dans Visual Studio. Cependant, vous ne pouvez rien faire de «créatif», comme demander une saisie de clé ou de texte, ou effacer la console - vous obtiendrez des exceptions d'exécution.

Stolsvik
la source
25
Je trouve cela particulièrement maladroit. Quelle est, je me demande, la justification derrière cela dans VS? Cela devrait être la capacité de tous les IDE modernes d'avoir un panneau dans l'EDI lui-même se comportant comme la console pour l'entrée et la sortie. (gratte la tête)
12
La question indique clairement pour une "application console" et la changer pour quelque chose d'autre juste à des fins de débogage, où je ne peux même pas Console.ReadKey()est tout simplement ridicule!
MickyD
Je ne sais pas pourquoi, mais lorsque j'ai essayé de revenir de l' Output typeapplication Windows à la console, la fenêtre de la console n'est pas visible lorsque j'exécute mon application. Je suis capable de déboguer l'application et le Mainpoint d'entrée est également touché. J'ai également annulé le paramètre d'option mentionné dans cet article, mais en vain. J'utilise l'édition communautaire VS 2017. J'ai perdu la fenêtre de ma console (sanglotant).
RBT
3
Pour ce que cela vaut, dans VS 15.8.7, la seule façon dont je pouvais obtenir la sortie à rediriger pour une application console était de la changer en une application Windows et de laisser la boîte de redirection NON CONTRÔLÉE. Si je coche la case, cela n'affiche pas la sortie.
dpberry178
6

Utilisation System.Diagnostics.Trace

En fonction des écouteurs que vous attachez, la sortie de la trace peut accéder à la fenêtre de débogage, à la console, à un fichier, à une base de données ou tout à la fois. Les possibilités sont littéralement infinies, car la mise en œuvre de votre propre TraceListener est extrêmement simple.

Joël Coehoorn
la source
Oui, mais ce que je veux savoir, c'est s'il est possible de le faire simplement, sans avoir à le mettre en œuvre moi-même.
dévoré l'elysium
@devoured La classe Trace sort uniquement dans la fenêtre de débogage par défaut. Il vous suffit de joindre des écouteurs supplémentaires (et il y en a plusieurs déjà écrits que vous pouvez utiliser) si vous voulez également voir la sortie ailleurs.
Joel Coehoorn
1
Je suis allé dans ma boîte de dialogue Options de débogage et j'ai choisi «Rediriger tout le texte de la fenêtre de sortie vers la fenêtre d'exécution» pour que la sortie de trace aille dans la fenêtre d'exécution afin qu'elle ne soit pas mélangée avec la merde de débogage.
Gabe
2

Il est temps de vérifier les dernières versions de Visual Studio, mes amis. La solution la plus suggérée qui n'a pas fonctionné pour certains d'entre vous auparavant pourrait fonctionner maintenant.

Dans Visual Studio 2017 ( version 15.4.2 et supérieure), aller à Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowa fonctionné pour moi.

Quelques notes: 1. Pour voir la fenêtre Exécution, assurez-vous que vous êtes en mode Débogage . 2. Il devrait maintenant y avoir 3 autres outils de débogage disponibles à votre disposition, à savoir, Call Stack, Breakpoints et Command Window, comme indiqué ci-dessous:

entrez la description de l'image ici

Meilleurs vœux!

kuzevni
la source
Testé en v15.9.4, ne fonctionne pas (du moins pas pour une application console).
bta
Hmm. Si vous pouvez partager une capture d'écran de vos configurations, je peux essayer de reproduire le problème de mon côté. Sinon, vous pouvez partager votre solution si elle a été résolue. Les notes de publication pour Visual Studio 15.9.4 sont disponibles sur docs.microsoft.com/en-us/visualstudio/releasenotes/… , vous pouvez y trouver des conseils utiles en fonction de votre environnement. Documentation Visual Studio 2017 (fenêtre de sortie) : docs.microsoft.com/en-us/visualstudio/ide/reference
...
Vérifiez que le projet avec lequel vous testez a été créé en tant qu '"application console" et non en tant qu' "application Windows". Votre approche fonctionne avec une application Windows, mais ce n'est pas ce que l'OP a spécifié.
bta
1

Vous pouvez créer une application wrapper que vous exécutez au lieu d'exécuter directement votre application réelle. L'application wrapper peut écouter stdout et tout rediriger vers Trace. Modifiez ensuite les paramètres d'exécution pour lancer votre wrapper et transmettez le chemin d'accès à l'application réelle à exécuter.

Vous pouvez également demander au wrapper d'attacher automatiquement le débogueur au nouveau processus si un débogueur est attaché au wrapper.

Samuel Neff
la source
0

Je sais que ce n'est qu'une autre réponse, mais j'ai pensé écrire quelque chose pour les nouveaux développeurs Web, qui pourraient être confus à propos de la partie "Changer vers une application Windows", car je pense par défaut à une application MVC dans Visual Studio 2013 par défaut, un type de sortie de bibliothèque de classes.

Mon application Web est définie par défaut comme un type de sortie de «Bibliothèque de classes». Vous n'êtes pas obligé de changer cela. Tout ce que j'avais à faire était de suivre les suggestions d'aller dans Outils> Options> Débogage> Rediriger tout le texte de la fenêtre de sortie vers la fenêtre immédiate. J'ai ensuite utilisé la System.Diagnostics.Tracesuggestion de Joel Coehoorn ci-dessus.

joshmcode
la source
0

Une solution simple qui fonctionne pour moi, pour travailler avec la capacité de la console (ReadKey, String avec format et arg etc) et pour voir et enregistrer la sortie:

Je vous écris TextWriter qui écrivent Consoleet Traceet remplacer le Console.Outavec elle.

si vous utilisez Dialogue -> Débogage -> Cochez la case "Rediriger tout le texte de la fenêtre de sortie vers la fenêtre d'exécution", vous l'obtenez dans la fenêtre d'exécution et assez propre.

mon code: au début de mon code:

   Console.SetOut(new TextHelper());

et la classe:

public class TextHelper : TextWriter
    {
        TextWriter console;

        public TextHelper() {
            console = Console.Out;
        }

        public override Encoding Encoding { get { return this.console.Encoding; } }
        public override void WriteLine(string format, params object[] arg)
        {
            string s = string.Format(format, arg);
            WriteLine(s);
        }
        public override void Write(object value)
        {
            console.Write(value);
            System.Diagnostics.Trace.Write(value);
        }

        public override void WriteLine(object value)
        {
            Write(value);
            Write("\n");
        }
        public override void WriteLine(string value)
        {
            console.WriteLine(value);
            System.Diagnostics.Trace.WriteLine(value);

        }

    }

Remarque: je remplace juste ce dont j'avais besoin, donc si vous écrivez d'autres types, vous devriez remplacer plus

Sarel Foyerlicht
la source
0

concernant la System.Diagnostics.Debugproduction de beaucoup de "junk" dans la fenêtre de sortie: Vous pouvez désactiver cela en cliquant avec le bouton droit dans la fenêtre de sortie. Par exemple, il y a un élément "Module Load Messages" que vous souhaitez désactiver et un élément "Program Output" que vous souhaitez conserver.

user829755
la source
0

Vous avez trois possibilités pour le faire, mais ce n'est pas anodin. L'idée principale de tous les IDE est qu'ils sont tous les parents des processus enfants (débogage). Dans ce cas, il est possible de manipuler avec l'entrée, la sortie et le gestionnaire d'erreurs standard. Ainsi, les IDE démarrent les applications enfants et les redirigent vers la fenêtre de sortie interne. Je connais une autre possibilité, mais cela viendra dans le futur

  1. Vous pouvez implémenter votre propre moteur de débogage pour Visual Studio. Démarrage et débogage du contrôle du moteur de débogage pour l'application. Vous pouvez trouver des exemples pour cela sur docs.microsoft.com ( moteur de débogage Visual Studio )
  2. Redirigez l'application de formulaire en utilisant la duplication du gestionnaire std pour c ++ ou utilisez Console.SetOut (TextWriter) pour c #. Si vous devez imprimer dans la fenêtre de sortie, vous devez utiliser le SDK d'extension de Visual Studio. Exemple de la deuxième variante que vous pourriez trouver sur Github .
  3. Démarrez l'application qui utilise System.Diagnostics.Debug.WriteLine (pour l'impression en sortie) et ensuite il démarrera l'application enfant. Au démarrage d'un enfant, vous devez rediriger stdout vers le parent avec des tubes. Vous pouvez trouver un exemple sur MSDN. Mais je pense que ce n'est pas la meilleure façon.
Galina Khrychikova
la source
0

Si vous avez besoin de la sortie de Console.WriteLine et que le texte de la fenêtre Rediriger tout la sortie vers la fenêtre immédiate ne fonctionne pas et que vous devez connaître la sortie des tests de l'Explorateur de tests intégré, en utilisant NUnit.Framework, notre problème est déjà résolu à VS 2017 :

Exemple tiré de C # en profondeur par Jon Skeet: Exemple tiré de C # en profondeur par Jon Skeet Cela produit cette sortie dans Text Explorer: Explorateur de tâches

Lorsque nous cliquons sur Blue Output, sous Elapsed Time, à droite, et cela produit ceci: Sortie standard

La sortie standard est la sortie souhaitée, produite par Console.WriteLine.

Il fonctionne pour la console et pour les applications Windows Form à VS 2017, mais uniquement pour la sortie générée pour l'Explorateur de tests au débogage ou à l'exécution; de toute façon, c'est mon principal besoin de sortie Console.WriteLine.

Marcelo Scofano
la source
-1

Au lieu de cela, vous pouvez collecter la sortie dans un résultat de test.

Vous ne pouvez pas fournir d'entrée, mais vous pouvez facilement fournir plusieurs tests avec différents arguments de ligne de commande, chaque test collectant la sortie.

Si votre objectif est le débogage, il s'agit d'un moyen sans effort d'offrir un scénario de débogage reproductible.

namespace Commandline.Test
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}
uffehellum
la source
-7

Étape 1: Cliquez avec le bouton droit sur le nom du projet dans l'Explorateur de solutions, puis définissez le type de sortie comme application de fenêtre

Étape 2: Débogage -> Options .. -> Débogage (développer) -> Général -> Rediriger tout le texte de la fenêtre de sortie vers la fenêtre d'exécution

Balaji Dinakaran
la source
3
Cette réponse a été donnée trois fois auparavant. Il ne répond pas à la question posée.
Klay