簡體   English   中英

WPF /控制台混合應用程序

[英]WPF / Console Hybrid Application

我編寫的應用程序可以在命令行上運行,也可以使用WPF UI運行。

[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來執行它,我會彈出一個控制台窗口。 如果未設置標志(通過命令args傳入),我不想向用戶顯示控制台窗口。

但是,如果我將項目的輸出類型設置為Windows應用程序,雙擊行為很好,但是當我在控制台中運行它時,我沒有控制台輸出(Console.Writeline)

你最好的選擇是將實際完成工作的代碼抽象到一個沒有UI的獨立類庫,然后創建兩個應用程序,一個控制台,另一個調用它的WPF。

控制台應用程序和WPF應用程序具有完全不同的應用程序模型,因此您無法在兩個應用程序中重用相同的代碼。

擁有一個單獨的類庫允許您執行其他操作,例如在其他應用程序(如網站或客戶端/服務器體系結構)中使用它。

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

public partial class App
{
    protected override void OnStartup(StartupEventArgs 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
        {
            base.OnStartup(e);
        }
    }

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

您可以通過以下示例執行以下步驟來有條件地啟動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(); } } 

我知道我參加聚會有點晚了,但我覺得我可以投入兩分錢。 您可以始終將其保留為控制台應用程序,然后根據此答案隱藏控制台( https://stackoverflow.com/a/3571628/1059953 )。 有一個控制台顯示的時刻,然后它消失,窗口出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM