Ter a saída de um aplicativo de console no Visual Studio em vez do console


120

Ao fazer um aplicativo de console em Java com Eclipse, vejo a saída sendo colocada em uma caixa de texto no próprio IDE, em vez de ter um console aparecendo como no Visual Studio. Isso é útil, pois, mesmo após a saída do programa, ainda posso fazer bom uso do texto que foi escrito nele, pois ele não é apagado até que eu o execute novamente. É possível conseguir algo assim com o Visual Studio? Eu sei que ao invés de fazer

System.Console.WriteLine(str);

eu posso fazer

System.Diagnostics.Debug.WriteLine(str);

mas não é exatamente a mesma coisa, pois você recebe um monte de "lixo" na janela Saída, como todos os símbolos carregados e tal.

Melhor ainda, é possível ter tudo feito no próprio IDE, quando você executa o aplicativo, em vez de o console estar em execução?


Qual versão do VS você está usando?
— Gabe

Você tem um painel de resultados de teste?
— Gabe

Eu nunca notei isso. Eu irei checar isso. Devo tê-lo?
— devorado elysium

Respostas:


52

Na caixa de diálogo Ferramentas -> Opções do Visual Studio -> Depuração -> Marque a opção "Redirecionar todo o texto da janela de saída para a janela imediata".


68
Marquei esta caixa de seleção, mas ainda recebo um pop-up do console e nada na janela "Saída" (depuração, teste, compilação, ..) ou na "janela imediata".
— GuiSim 15/02/12

6
@EvenLisle, você precisa alterar o tipo de aplicativo para Windows Application, como na resposta do stolsvik . A opção mencionada nesta resposta estava ativada por padrão para mim em qualquer caso.
— precisa saber é o seguinte

3
O que significa "Redirecionar todo o texto da janela de saída para a janela imediata" exatamente? Use vários contextos, se necessário. Estou confuso com o que é a "janela imediata".
— Xonatron

11
@TooTone A pergunta afirma claramente para um "aplicativo de console" e alterá-lo para outra coisa apenas para fins de depuração, onde eu nem consigo Console.ReadKey () é simplesmente ridículo!
— MickyD

1
Funciona apenas com Debug.WriteLine (), não funciona com Console.WriteLine () :(
— Y2i

45

Na caixa de diálogo Opções do Visual Studio -> Depuração -> marque a opção "Redirecionar todo o texto da janela de saída para a janela imediata". Em seguida, vá para as configurações do seu projeto e altere o tipo de "Aplicativo de console" para "Aplicativo do Windows". Nesse ponto, o Visual Studio não abre mais uma janela do console e a saída é redirecionada para a janela Saída no Visual Studio. No entanto, você não pode fazer nada "criativo", como solicitar entrada de chave ou texto ou limpar o console - você obterá exceções de tempo de execução.


25
Acho isso particularmente desajeitado. Qual é a razão por trás disso no VS? Deveria ser a capacidade de todos os IDE modernos de fazer com que um painel dentro do próprio IDE se comportasse como o console de entrada e saída. (cabeça arranhões)

12
A pergunta afirma claramente para um "aplicativo de console" e alterá-lo para outra coisa apenas para fins de depuração, onde eu não posso nem Console.ReadKey()é ridículo!
— MickyD

Não sei por que, mas quando tentei reverter o Output typeaplicativo novamente do Windows Application para o Console, a janela do console não será exibida quando executo o aplicativo. Eu sou capaz de depurar o aplicativo e o Mainponto de entrada também está sendo atingido. Também reverti a configuração da opção mencionada neste post, mas sem sucesso. Estou usando o VS 2017 community edition. Perdi a janela do console (soluçando).
— RBT

3
Pelo que vale a pena, no VS 15.8.7, a única maneira de conseguir redirecionar a saída para um aplicativo de console era alterá-lo para um aplicativo do Windows e deixar a caixa Redirecionar DESATIVADA. Se eu marcar a caixa, ela não exibirá a saída.
— dpberry178

6

Usar System.Diagnostics.Trace

Dependendo dos ouvintes que você anexa, a saída de rastreio pode ir para a janela de depuração, o console, um arquivo, banco de dados ou todos de uma vez. As possibilidades são literalmente infinitas, pois a implementação do seu próprio TraceListener é extremamente simples.


Sim, mas o que eu quero saber é se é possível fazê-lo, sem ter que implementá-lo sozinho.
— devorado elysium

@devoured A classe Trace gera apenas para a janela de depuração por padrão. Você só precisa anexar ouvintes extras (e já existem vários escritos que você pode usar) se quiser ver também a saída em outro lugar.
— Joel Coehoorn

1
Eu fui à minha caixa de diálogo Opções de depuração e escolhi "Redirecionar todo o texto da janela de saída para a janela imediata" para fazer com que a saída de rastreamento vá para a janela imediata, para que não fique toda misturada com a porcaria de depuração.
— Gabe

2

Chegou a hora de verificar os últimos lançamentos do Visual Studio, pessoal. A solução mais sugerida que não funcionou para alguns de vocês antes pode funcionar agora.

No Visual Studio 2017 ( versão 15.4.2 e superior), o ir Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowfuncionou para mim.

Algumas notas: 1. Para ver a janela imediata, verifique se você está no modo de depuração . 2. Agora deve haver mais 3 ferramentas de depuração disponíveis, a saber, Pilha de chamadas, Pontos de interrupção e Janela de comando, como mostrado abaixo:

insira a descrição da imagem aqui

Muitas felicidades!


Testado na v15.9.4, não funciona (não para um aplicativo de console, pelo menos).
— quer

Hmm. Se você pode compartilhar uma captura de tela de suas configurações, posso tentar replicar o problema do meu lado. Caso contrário, você poderá compartilhar sua solução se ela tiver sido resolvida. As notas de versão do Visual Studio 15.9.4 estão disponíveis em docs.microsoft.com/en-us/visualstudio/releasenotes/… , você pode encontrar algumas dicas úteis dependendo do seu ambiente. Visual Studio 2017 (janela de saída) Documentação : docs.microsoft.com/en-us/visualstudio/ide/reference/...
— kuzevni

Verifique se o projeto que você está testando foi criado como um "aplicativo de console", não um "aplicativo do Windows". Sua abordagem funciona com um aplicativo do Windows, mas não é o que o OP especificou.
— bta

1

Você pode criar um aplicativo wrapper que você executa em vez de executar diretamente seu aplicativo real. O aplicativo wrapper pode ouvir stdout e redirecionar tudo para o Trace. Em seguida, altere as configurações de execução para iniciar seu wrapper e passar o caminho para o aplicativo real a ser executado.

Você também pode fazer com que o wrapper anexe automaticamente o depurador ao novo processo se um depurador estiver anexado ao wrapper.


0

Sei que essa é apenas outra resposta, mas pensei em escrever algo para os novos desenvolvedores da Web, que podem ficar confusos com a parte "Alterar para um aplicativo do Windows", porque acho que por padrão um aplicativo MVC no Visual Studio 2013 o padrão é um Tipo de saída da biblioteca de classes.

Meu aplicativo Web, por padrão, é definido como um tipo de saída de "Biblioteca de classes". Você não precisa mudar isso. Tudo o que eu precisava fazer era seguir as sugestões de ir para Ferramentas> Opções> Depuração> Redirecionar todo o texto da Janela de Saída para a Janela Imediata. Eu então usei a System.Diagnostics.Tracesugestão de Joel Coehoorn acima.


0

Uma solução simples que funciona para mim, trabalhar com a capacidade do console (ReadKey, String with Format e arg etc) e ver e salvar a saída:

Eu escrevo TextWriter que escreve para Consolee para Tracee substitui o Console.Outpor ele.

se você usar Diálogo -> Depuração -> Marque o "Redirecionar todo o texto da janela de saída para a janela imediata", você o obtém na Janela imediata e é bastante limpo.

meu código: no começo do meu código:

   Console.SetOut(new TextHelper());

e a 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);

        }

    }

Nota: Eu substituo exatamente o que eu precisava. Se você escrever outros tipos, substitua mais


0

em relação à System.Diagnostics.Debugprodução de "lixo" na janela Saída: você pode desativá-lo clicando com o botão direito do mouse na janela de saída. Por exemplo, existe um item "Module Load Messages" que você deseja desativar e um item "Program Output" que você deseja manter.


0

Você tem três possibilidades para fazer isso, mas não é trivial. A idéia principal de todos os IDEs é que todos eles são os pais dos processos filhos (depuração). Nesse caso, é possível manipular com entrada, saída e manipulador de erros padrão. Portanto, os IDEs iniciam aplicativos filhos e redirecionam para a janela de saída interna. Eu sei de mais uma possibilidade, mas ela virá no futuro

  1. Você pode implementar seu próprio mecanismo de depuração para o Visual Studio. Controle do mecanismo de depuração iniciando e depurando para o aplicativo. Exemplos para isso, você pode encontrar como fazer isso em docs.microsoft.com ( mecanismo de depuração do Visual Studio )
  2. Redirecione o aplicativo de formulário usando a duplicação do manipulador std para c ++ ou use Console.SetOut (TextWriter) para c #. Se você precisar imprimir na janela de saída, precisará usar a extensão SDK do Visual Studio. Exemplo da segunda variante que você pode encontrar no Github .
  3. Inicie o aplicativo que usa System.Diagnostics.Debug.WriteLine (para imprimir na saída) e inicie o aplicativo filho. Ao iniciar um filho, você precisa redirecionar o stdout para o pai com pipes. Você pode encontrar um exemplo no MSDN. Mas acho que esse não é o melhor caminho.

0

Se você precisar de saída do Console.WriteLine e o texto da janela Redirecionar todas as saídas para a janela imediata não funcionar, você precisará conhecer a saída dos testes do Integrated Test Explorer, usando o NUnit.Framework, nosso problema já foi resolvido no VS 2017 :

Exemplo extraído de C # In Depth por Jon Skeet: Exemplo extraído de C # In Depth por Jon Skeet Isso produz esta saída no Text Explorer: Gerenciador de tarefas

Quando clicamos em Saída azul, em Tempo decorrido, à direita, e produz isso: Saída padrão

Saída padrão é a saída desejada, produzida por Console.WriteLine.

Ele funciona para o console e para aplicativos de formulário do Windows no VS 2017, mas apenas para a saída gerada para o Test Explorer em Debug ou Run; de qualquer maneira, essa é minha principal necessidade de saída do Console.WriteLine.


-1

Em vez disso, você pode coletar a saída em um resultado de teste.

Você não pode fornecer entrada, mas pode facilmente fornecer vários testes com argumentos de linha de comando diferentes, cada um coletando a saída.

Se seu objetivo é depurar, é uma maneira de baixo esforço de oferecer um cenário de depuração repetível.

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

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

-7

Etapa 1: Clique com o botão direito do mouse no Nome do projeto no Solution Explorer e, em seguida, faça o Tipo de saída como Aplicativo da janela

Etapa 2: Depurar -> Opções ..--> Depuração (Expandir) -> Geral -> Redirecionar Todo o Texto da Janela de Saída para a Janela Imediata


3
Esta resposta foi dada três vezes anteriormente. Não aborda a pergunta feita.
— Klay
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.