2010-04-14 17 views
5

Creé una aplicación de Windows Forms de VB.NET en Visual Studio 2008. Cuando ejecuto mi programa desde la línea de comandos, no obtengo ningún resultado (solo el siguiente mensaje).Console.Write no funciona en la aplicación Win Forms

¿Qué estoy haciendo mal?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Debug.Write("Foo") 
    Debug.Flush() 
    Console.WriteLine("foo") 
    Console.Beep(800, 100) 'confirm this function is called' 
    Me.Close() 
End Sub 

EDIT: Puede un programa tiene una forma y una consola?

EDIT2: La respuesta de Ho funciona. Sin embargo, el resultado aparece en el siguiente aviso de la línea de comando. ¿Puede una aplicación de Winforms decirle a la línea de comandos que espere hasta que finalice en lugar de regresar de inmediato?

+0

¿Hace algo cuando se ejecuta directamente desde Visual Studio? Dado que esto está respondiendo a un evento de carga y no se está llamando, entonces eso significaría que probablemente Form1 no se está creando. – Tarka

+0

Sí. Cuando lo ejecuto (ya sea desde VS o desde la línea de comandos), escucho el pitido corto. – Steven

+0

Encontrará la salida en la ventana Salida de Visual Studio. –

Respuesta

2

O si ya tiene un Windows Forms aplicación puede adjuntarle una consola utilizando la API de AttachConsole.

using System.Runtime.InteropServices; 

...

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

...

AttachConsole(ATTACH_PARENT_PROCESS); 

(con formato de código)

+0

Versión de VB de esta obra. Sin embargo, el resultado aparece después de la siguiente solicitud de línea de comando. Ahora estoy tratando de descubrir cómo evitar que la línea de comando vuelva inmediatamente. – Steven

+1

Puede hacer "START yourapp.exe/WAIT" para que la línea de comandos espere, pero no creo que eso le proporcione exactamente lo que desea. –

+0

En realidad, eso funcionaría bien. ¡Gracias! – Steven

1

Tiene que crear una aplicación de línea de comandos/consola en lugar de una aplicación de formulario de Windows para usar la consola.

2

Intente crear un nuevo proyecto utilizando en su lugar la plantilla "Aplicación de consola".

4

Los otros tienen razón al decir que debe ejecutar su aplicación como una aplicación de consola. A su pregunta de si puede tener tanto una consola como una GUI: sí. Basta con añadir una referencia a System.Windows.Forms a su proyecto, y para el método de la aplicación Main, incluir este código:

' here instantiate whatever form you want to be your main form ' 
Dim f As New Form1 

' this will start the GUI loop, which will not progress past ' 
' this point until your form is closed ' 
System.Windows.Forms.Application.Run(f) 
9

Probado código similar con un C# .NET aplicación de Windows Forms. Emite y suena muy bien en Visual Studio, pero solo emite un pitido cuando se ejecuta en la línea de comandos.

Si puedo cambiar el tipo de salida a aplicación de consola en la pestaña de aplicaciones de las propiedades del proyecto, tengo que usar tanto la forma como la consola :)

+0

esta es la respuesta correcta. no se usa la interoperabilidad solo para una consola. –

+1

@Oren: si se cambia el proyecto a una aplicación de consola, por ejemplo, se desactivará el modificador * Application Framework *. Lo que significaría que el OP podría tener que escribir bastante código para reemplazar la funcionalidad que ese conmutador le dio de forma gratuita. Solo para evitar una llamada de interoperabilidad. Así que estoy en desacuerdo con que una respuesta es mejor que otra sin conocer más las circunstancias de los PO. –

+0

@ ho1 Al usar la interoperabilidad, mi winform genera una nueva ventana de consola, que desaparece instantáneamente tan pronto como finaliza mi aplicación. Esto hace que la integración de línea de comandos para mi winform sea bastante desordenada, p. escribiendo 'myApp.exe /?' muestra una ventana de la consola que desaparece al instante. Como tengo poca o ninguna experiencia con winforms y googlear para 'what is application framework' arroja resultados demasiado generales, le pregunto: ¿Por qué necesitaría esto * Application Framework *? – Nolonar

1

La solución es:

Declare Function AttachConsole Lib "kernel32.dll" (ByVal dwProcessId As Int32) As Boolean 
Declare Function FreeConsole Lib "kernel32.dll"() As Boolean 

[código .....]

cuando sea necesario, la salida de la consola solo llama a AttachConsole (-1) pero recuerde hacer una FreeConsole() al final de su programa.

el único problema de esta solución es que usted va a leer algo como esto:

C:> YourApp.exe
C:> Hello World!

Esto se debe a que una aplicación de formularios se ejecuta como un elemento secundario en el símbolo del sistema, por lo que el mensaje vuelve inmediatamente después de escribir el nombre de la aplicación.

En una aplicación de consola, el símbolo del sistema regresa después de que el programa sale.

Todavía estoy tratando de encontrar la manera de tener el mismo comportamiento (ejecución de sincronización) que en una aplicación de consola.

+0

Haga un poco de trampa y simplemente agregue 'Console.Write (String.Format (" {0}> ", AppDomain.CurrentDomain.BaseDirectory.TrimEnd (IO.Path.DirectorySeparatorChar)))' al final. Bueno, solo funciona si el usuario tiene el prompt predeterminado ('$ P $ G') pero supongo que esto encajará en el 99.99% de todos los casos. –

5

Puede ejecutar la aplicación desde la consola con myApp.exe|MORE
De esta manera la consola mostrará Console.WriteLine() llamadas procedentes de la aplicación y esperará hasta que se salga de la aplicación.
Disculpe mi mal inglés.

+1

¡Funciona muy bien! Gracias por la respuesta simple. – CodeThug

Cuestiones relacionadas