2011-03-17 11 views
11

Escribo una aplicación que se puede ejecutar en la línea de comandos o con una interfaz de usuario de WPF.WPF/Console Hybrid Application

[STAThread] 
static void Main(string[] args) 
{ 
    // Does magic parse args and sets IsCommandLine to true if flag is present 
    ParseArgs(args);  

    if(IsCommandLine) 
    { 
     // Write a bunch of things to the console 
    } 
    else 
    { 
     var app = new App(); 
     app.Run(new Window()); 
    } 
} 

puse Tipo de salida del proyecto de aplicación de consola, me sale una ventana de consola que popups si trato de ejecutarlo haciendo doble clic en el archivo EXE. No quiero mostrar la ventana de la consola al usuario si el indicador no está configurado (pasado a través de comandos args).

Sin embargo, si fijo Tipo de salida del proyecto de aplicación para Windows, el comportamiento del doble clic está muy bien, pero cuando lo ejecuto en la consola, me sale ninguna salida de la consola (Console.Writeline)

+0

has dado cuenta de esto? –

Respuesta

8

Su mejor la apuesta sería abstraer el código que realmente hace el trabajo a una biblioteca de clases separada que no tiene UI y luego crear dos aplicaciones una Consola, la otra WPF que lo llama.

+1

@Terenced - No lo creo. Una aplicación de consola y una aplicación WPF tienen modelos de aplicaciones completamente diferentes para empezar. – ChrisF

0

Puede iniciar condicionalmente su aplicación WPF realizando los siguientes pasos con el ejemplo siguiente.

  1. Agregue otro punto de entrada con el método 'Principal' declarado con STAThreadAttribute. Esto es requerido por WPF.
  2. En las propiedades de 'Proyecto' de su proyecto, elija 'Aplicación de consola' como salida y su nuevo método 'Principal' como 'Objeto de inicio' de la aplicación.

    using System; 
    
    public static class Program 
    { 
        [STAThreadAttribute] 
        public static void Main() 
        { 
         Console.WriteLine("What now?"); 
         Console.ReadKey(true); 
    
         App.Main(); 
        } 
    } 
    
0

Yo sé que soy un poco tarde a la fiesta, pero pensé que podría echar en mis dos centavos. Siempre puede mantenerlo como una aplicación de consola y luego ocultar la consola según esta respuesta (https://stackoverflow.com/a/3571628/1059953). Hay un momento de la consola que se muestra, luego desaparece y aparece la ventana.

1

crear una aplicación WPF y añadir el siguiente código a su clase de aplicación:

public partial class App 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     if (e.Args.Length > 0) 
     {     
      List<string> lowercaseArgs = e.Args.ToList().ConvertAll(x => x.ToLower()); 
      if (AttachConsole(ATTACH_PARENT_PROCESS)) 
      { 
       // your console app code     

       Console.Write("\rPress any key to continue..."); 
       Console.ReadKey(); 
       FreeConsole(); 
       Shutdown(); 
      } 
     } 
     else 
     { 
      var window = new MainWindow(); 
      window.Show(); 
     } 
    } 

    private const int ATTACH_PARENT_PROCESS = -1; 

    [DllImport("kernel32", SetLastError = true)] 
    private static extern bool AttachConsole(int dwProcessId); 

    [DllImport("kernel32.dll")] 
    private static extern bool FreeConsole(); 
}