2011-03-17 198 views
11

我正在編寫一個應用程序,它可以在命令行上運行,也可以通過WPF UI運行。WPF /控制檯混合應用程序

[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()); 
    } 
} 

我設置項目的輸出類型控制檯應用程序,我得到的彈出式菜單,如果我嘗試通過雙擊exe文件來執行它控制檯窗口。如果未設置標誌(通過命令參數傳入),我不想向用戶顯示控制檯窗口。

但是,如果我設置項目的輸出類型Windows應用程序,雙擊行爲是好的,但是當我在控制檯運行它,我沒有得到任何控制檯輸出(Console.Writeline)

+0

你想通了這一點? – 2015-10-26 14:24:55

回答

8

你最好的打賭是將實際完成工作的代碼抽象爲一個單獨的沒有UI的類庫,然後創建兩個應用程序一個控制檯,另一個WPF調用它。

+1

@Terenced - 我不這麼認爲。控制檯應用程序和WPF應用程序具有完全不同的應用程序模型。 – ChrisF 2011-03-18 15:54:40

0

通過執行下面的示例,您可以有條件地啓動您的WPF應用程序。

  1. 用STAThreadAttribute聲明的'Main'方法添加另一個入口點。這是WPF需要的。
  2. 在項目的「構建」屬性下,選擇「控制檯應用程序」作爲輸出,並選擇新的「主要」方法作爲應用程序的「啓動對象」。

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

我知道我有點遲到了,但想我能在我的兩分錢折騰。您可以隨時將其保存爲控制檯應用程序,然後根據此答案隱藏控制檯(https://stackoverflow.com/a/3571628/1059953)。有一個顯示控制檯的時刻,然後消失,窗口出現。

1

創建一個WPF應用程序,將下面的代碼添加到您的App類:

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(); 
}