Para ficar preso imediatamente, um exemplo muito básico:
using System;
using System.Windows.Forms;
class test
{
static void Main()
{
Console.WriteLine("test");
MessageBox.Show("test");
}
}
Se eu compilar isso com opções padrão (usando csc na linha de comando), conforme o esperado, ele será compilado em um aplicativo de console. Além disso, como eu importei System.Windows.Forms
, ele também mostrará uma caixa de mensagem.
Agora, se eu usar a opção /target:winexe
, que eu acho que é o mesmo que escolher Windows Application
entre as opções do projeto, conforme o esperado, só verei a Caixa de Mensagens e nenhuma saída do console.
(De fato, no momento em que é iniciado a partir da linha de comando, posso emitir o próximo comando antes que o aplicativo seja concluído).
Então, minha pergunta é - eu sei que você pode ter "janelas" / formulários de um aplicativo de console, mas existe uma maneira de mostrar o console de um aplicativo do Windows?
Respostas:
este deve funcionar.
fonte
>
para redirecionar a saída, recebo uma janela de console separada e zero resultado no meu arquivo.Talvez isso seja simplista demais ...
Crie um projeto Windows Form ...
Em seguida: Propriedades do projeto -> Aplicativo -> Tipo de saída -> Aplicativo do console
Então pode ter Console e Forms rodando juntos, funciona pra mim
fonte
>
. No entanto, eu esperava uma solução que explicasse como executar um "Aplicativo de console" apenas algumas vezes (ou seja, para ativar programaticamente o que quer que seja que a alteração dessa misteriosa configuração do Visual Studio). Alguém sabe como isso funciona sob o capô?Se você não estiver preocupado em abrir um console sob comando, poderá acessar as propriedades do seu projeto e alterá-lo para Console Application
.
Isso ainda mostrará seu formulário, além de aparecer uma janela do console. Você não pode fechar a janela do console, mas funciona como um excelente criador de logs temporário para depuração.
Lembre-se de desativá-lo antes de implantar o programa.
fonte
Você pode chamar
AttachConsole
usando pinvoke para obter uma janela do console anexada a um projeto WinForms: http://www.csharp411.com/console-output-from-winforms-application/Você também pode considerar o Log4net ( http://logging.apache.org/log4net/index.html ) para configurar a saída do log em diferentes configurações.
fonte
Isso funcionou para mim, canalizar a saída para um arquivo. Ligue para o console com
Adicione esse código ao seu aplicativo.
Encontrei este código aqui: http://www.csharp411.com/console-output-from-winforms-application/ Eu pensei que era digno de publicá-lo aqui também.
fonte
AttachConsole(ATTACH_PARENT_PROCESS)
eu recebo a saída do console, mas redirecioná-lo na linha de comando com>
não funciona. Quando tento esta resposta, não consigo obter nenhuma saída, seja no console ou em um arquivo.Existem basicamente duas coisas que podem acontecer aqui.
Saída do console É possível que um programa winforms se conecte à janela do console que o criou (ou a uma janela diferente do console, ou mesmo a uma nova janela do console, se desejar). Uma vez anexado à janela do console, Console.WriteLine () etc funciona conforme o esperado. Uma dica para essa abordagem é que o programa retorna o controle para a janela do console imediatamente e depois continua gravando, para que o usuário também possa digitar na janela do console. Você pode usar start com o parâmetro / wait para lidar com isso, eu acho.
Link para iniciar a sintaxe do comando
Saída de console redirecionada É quando alguém canaliza a saída do seu programa em outro lugar, por exemplo.
yourapp> file.txt
A conexão a uma janela do console nesse caso ignora efetivamente a tubulação. Para fazer isso funcionar, você pode chamar Console.OpenStandardOutput () para obter um identificador para o fluxo no qual a saída deve ser canalizada. Isso funciona apenas se a saída for canalizada, portanto, se você quiser lidar com os dois cenários, precisará abrir a saída padrão e gravá-la e anexá-la à janela do console. Isso significa que a saída é enviada para a janela do console e para o canal, mas é a melhor solução que eu poderia encontrar. Abaixo do código que eu uso para fazer isso.
fonte
Console.WriteLine
em vez disso, chamar o novoWriteLine
definido acima. Mesmo que eu tenha tentado não conseguir, com esse código, redirecionar qualquer coisa para um arquivo ao executar o aplicativo na linha de comando e redirecioná-lo>
para um arquivo.Console.WriteLine
é apenas uma boa prática, pois permite testar e alterar facilmente os locais nos quais você faz logon (por exemplo, você pode começar a fazer logon em um serviço de log baseado em nuvem como o PaperTrail ou qualquer outra coisa )StreamWriter _stdOutWriter;
Crie um aplicativo Windows Forms e altere o tipo de saída para console.
Isso resultará em um console e no formulário para abrir.
fonte
fonte
fonte
StandardHandle : uint
está errado aqui ... deve ser IntPtr para trabalhar tanto em x86 e x64Você pode alternar a qualquer momento entre os tipos de aplicativos, para o console ou o Windows. Portanto, você não escreverá uma lógica especial para ver o stdout. Além disso, ao executar o aplicativo no depurador, você verá todo o stdout na janela de saída. Você também pode adicionar um ponto de interrupção e, nas propriedades do ponto de interrupção, alterar "When Hit ...", pode enviar mensagens e variáveis. Além disso, você pode marcar / desmarcar "Continuar execução", e seu ponto de interrupção se tornará quadrado. Portanto, as mensagens do ponto de interrupção sem alterar nada no aplicativo na janela de saída de depuração.
fonte
Por que não deixá-lo como um aplicativo do Windows Forms e criar um formulário simples para imitar o console. O formulário pode ser criado para se parecer com o console com tela preta e responder diretamente ao pressionamento de tecla. Em seguida, no arquivo program.cs, você decide se precisa executar o formulário principal ou o ConsoleForm. Por exemplo, eu uso essa abordagem para capturar os argumentos da linha de comando no arquivo program.cs. Crio o ConsoleForm, inicialmente o oculto e transmito as seqüências de caracteres da linha de comando para uma função AddCommand, que exibe os comandos permitidos. Finalmente, se o usuário forneceu -h ou -? , chamo o .Show no ConsoleForm e, quando o usuário pressiona qualquer tecla, encerro o programa. Se o usuário não der o -? comando, fecho o ConsoleForm oculto e execute o formulário principal.
fonte