有的时候,我们希望窗体程序也能接受命令行参数,以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
 8
using System.Runtime.InteropServices;
 9
10
namespace 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
 
 
 这里是最后一个例子的代码。
WpfConsole