有的時候,我們希望窗體程序也能接受命令行參數,以Console的方式運行。但是實現起來卻要一些小技巧才能做到。如果做一個WPF程序,在Window的Loaded事件裡寫這樣的語句:
Console.WriteLine("Hello word.");
然後從CMD運行之。會發現這個語句根本沒有輸出出來。如圖1所示。

圖1. 從命令行運行Wpf程序
對於這個問題有三個解決方案。三個方案各有優缺點,請酌情選擇。
1.使用more命令:這種方案不需要修改任何代碼,只要在從命令行運行時加個 “ | more”即可。如圖2 所示。

圖2. 使用more重定向輸出
2.更改程序的Output Type:在VS的菜單中找到Project -> [Project Name] Properties…,選擇Application選項卡。把其中的Output Type,從Windows Application更改成Console Application。後果是無論是不是從命令行運行,都有個Console窗口隨著主窗體一起出來。如圖3所示。

圖3. Output Type改成Console Application的效果
3.Windows API調用:通過調用kernel32.dll裡的AttachConsole,可以把WPF程序與一個Console相關聯。代碼如下。
ConsoleAttacher
1/**////////////////////////////////////////////////////////
2// Console Attacher
3// Version 1.0
4// Powered by nankezhishi
5// nankezhishi@gmail.com
6/**////////////////////////////////////////////////////////
7
8using System.Runtime.InteropServices;
9
10namespace WpfConsole
11{
12 /**//// <summary>
13 ///
14 /// </summary>
15 public class ConsoleAttacher
16 {
17 private const int ATTACH_PARENT_PROCESS = -1;
18
19 /**//// <summary>
20 ///
21 /// </summary>
22 public static void AttachParentConsole()
23 {
24 AttachConsole(ATTACH_PARENT_PROCESS);
25 }
26
27 [DllImport("Kernel32.dll", EntryPoint = "AttachConsole", CharSet = CharSet.Unicode, SetLastError = true)]
28 public static extern void AttachConsole(int dwProcessId);
29 }
30}
31
然後在Loaded事件裡加上對這個函數的調用。
ConsoleAttacher.AttachParentConsole();
運行結果如圖4所示。

圖4. Attach Console
這裡是最後一個例子的代碼。