2009-08-06 22 views
6

Estoy creando un proyecto de C# winforms que se puede ejecutar como una GUI o se puede operar desde la línea de comandos. Actualmente, puedo procesar la entrada y los argumentos de la línea de comando. Puedo ejecutar el programa desde la línea de comandos y puedo usar el programa para procesar los argumentos. Pero Console.Writeline() no hace absolutamente nada. ¿Alguna pista de por qué podría ser?Console.Writeline() no funciona

+3

Ver aquí: http://stackoverflow.com/questions/807998/how-do-i-create-ac-app-that-decides-itself-whether-to-show-as- a-console-o-wind – Thorarin

+0

¿Quiere decir cuando ejecuta su programa en modo de línea de comandos llamando a Console.WriteLine parece fallar silenciosamente? –

+0

Se puede tratar a continuación sencilla - void Main (string [] args) {estáticas foreach (arg cadena en args) { Console.WriteLine (arg); } Console.ReadLine(); } ¿funciona? – Mutant

Respuesta

6

En su mayor parte, consulte el answer here. Sin embargo, me gustaría señalar la existencia de la llamada a la API FreeConsole(), que le permite cerrar la consola con gracia.

[DllImport("kernel32.dll")] 
static extern int FreeConsole() 

Una cosa que me gustaría Nota: es posible ver algunos extraño es un símbolo del sistema que aparece en la parte delantera de su salida de la consola, si usted está lanzando desde una consola existente y uniendo a que con AttachConsole (como se opuesto a AllocConsole).

Este es un problema de temporización que es difícil de solucionar. Si eso es un problema, configure su aplicación para que sea una aplicación de consola como las otras sugeridas. Sin embargo, no tendrá el efecto de que aparezca un símbolo del sistema hasta que se cierre la aplicación, lo que podría no ser lo que desea si está abriendo un formulario de win.

En respuesta a tu comentario: o está AttachConsoleoAllocConsole. El ejemplo que he vinculado intenta conectarse a una consola existente primero. Si eso falla (probablemente porque no existe), crea una nueva ventana de consola.

Si encuentra una manera de obtener lo mejor de ambos mundos en términos de comportamiento de línea de comandos y modo interactivo GUI, hágamelo saber. No he hecho una búsqueda exhaustiva de una solución, pero tengo algunas aplicaciones menores que se beneficiarían.

Por cierto: si planeas utilizar pipes en tu línea de comandos (redireccionando la salida a un archivo, por ejemplo), eso no funcionará así por desgracia.

+0

Esta solución funciona muy bien. Afortunadamente no necesito tuberías. ¡¡Gracias!! – novacara

0

Tiene que ver con el tipo de proyecto que se configura en la pestaña de aplicaciones en las propiedades del proyecto, que tienen 3 opciones:

  • aplicación de consola
  • Win Aplicación
  • Biblioteca de clases

Sin embargo, si trabaja con la aplicación Win, también puede procesar los argumentos de línea de comando, ya que estos se reciben en la función Principal.

0

El proyecto debe configurarse para compilarse en una aplicación de consola para que funcione la consola. Por otro lado, siempre tendrá una ventana de consola, incluso cuando se ejecuta como GUI. No sé de una solución para esto (pero estaría interesado en saber si hay alguno).

3

Esto se debe a que ha escrito una aplicación de winforms; esto significa que System.Console.Out (es decir, la secuencia de salida estándar) está configurada en Stream.Null. Esto significa que cualquier llamada a esa secuencia fallará en silencio.

Puede procesar la entrada desde la línea de comandos porque provienen de una secuencia diferente. La moraleja de la historia es que puedes tener una aplicación de winforms o una aplicación de línea de comando, pero no ambas a la vez.

+0

Sí, tipo de ... Windows API llama al rescate :) – Thorarin

5

Puede activar la consola en una aplicación de formas de las ventanas usando los siguientes DllImports:

[DllImport("kernel32.dll")] 
    static extern bool AttachConsole(int dwProcessId); 
    private const int ATTACH_PARENT_PROCESS = -1; 

    [DllImport("kernel32.dll", SetLastError = true)] 
    internal static extern int FreeConsole(); 

A continuación, puede activar la consola usando:

AttachConsole(ATTACH_PARENT_PROCESS); 

Y se puede desactivar usando:

 FreeConsole(); 
2

Hice esto en un hilo de fondo que ejecuta una función desde una carga dinámica DLL (reflexión)

AllocConsole(); 
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 

StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput()); 
standardOutput.AutoFlush = true; 
Console.SetOut(standardOutput); 
// 
//Console writing here 
// 
FreeConsole(); 

Mi consola estaba en blanco hasta que he añadido el Console.SetOut(), no estoy seguro de que necesita llamar GetStdHandle()

+0

Gracias, tenía una AllocConsole que funcionaba desde hacía tiempo, y de repente ya no funcionaba. Añadiendo Console.SetOut() hizo el truco! –

1

Es posible que necesite cambiar el tipo de aplicación. Esto se puede hacer por cualquiera de cambiarlo a través de propiedades de la aplicación en la interfaz gráfica de usuario (como se explica en el answer de ConsultUtah) o puede editar el archivo .csproj:

Winform/WPF:

<OutputType>WinExe</OutputType> 

consola (esto es lo que necesita para console.writeline() a estar trabajando):

<OutputType>Exe</OutputType> 

DLL (incluyendo applicatio web ns):

<OutputType>Library</OutputType> 
Cuestiones relacionadas