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?

elísio devorado
fonte
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".

SharpSteve
fonte
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.

Stolsvik
fonte
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.

Joel Coehoorn
fonte
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!

kuzevni
fonte
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.

Samuel Neff
fonte
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.

joshmcode
fonte
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

Sarel Foyerlicht
fonte
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.

user829755
fonte
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.
Galina Khrychikova
fonte
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.

Marcelo Scofano
fonte
-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]);
        }
    }
}
uffehellum
fonte
-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

Balaji Dinakaran
fonte
3
Esta resposta foi dada três vezes anteriormente. Não aborda a pergunta feita.
Klay