AllocConsole 重定向控制台使用

在软件开发的过程中,我们有时候可能需要日志和输出帮助我们进行 Debug 和 Review,尤其是 .NET C# 开发中,我们调试经常需要输出各种信息,当我们使用 IDEVisual Studio 的时候,VS 自带的输出没有我们自己开一个控制台那般阅读方便,所以我们可以使用 AllocConsole 重定向控制台。

1 . 引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class ConsoleWindow
{
[DllImport("kernel32.dll")]
private static extern bool AllocConsole();

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

[DllImport("kernel32.dll")]
private static extern IntPtr GetConsoleWindow();

[DllImport("kernel32.dll")]
private static extern int GetConsoleOutputCP();

public static bool HasConsole {
get { return GetConsoleWindow() != IntPtr.Zero; }
}

public static void Show() {
if (!HasConsole) {
AllocConsole();
}
}

public static void Close() {
if (HasConsole) {
SetOutAndErrorNull();
FreeConsole();
}
}
}

我们需要引用 Kernel32.dll 这个动态链接库文件中包含了 Windows 常见的内存管理数据的输入输出操作中断处理

2 . 启动

我们以 WPF 为例,我们可以重写App级的视图类来达到启动 WPF 程序的时候自动打开AllocConsole控制台。

{.line-numbers}
1
2
3
4
5
6
7
8
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

#if DEBUG
Common.Utility.ConsoleWindow.Show();
#endif
}

我们可以重写 OnStartup 方法,达到启动 WPF 程序的时候自动启动一个AllocConsole,这里我们用了一个 #if DEBUG,代表只在 Debug 调试模式下启动

3 . 设置程序输出类型

设置自己程序的 输出类型控制台应用程序

4 . 输出
1
Console.WriteLine()

使用控制台输出命令输出需要调试的日志和状态了,当然这里只是列举了输出,一切关于控制台的控制在引用AllocConsole以后都会表现出来。

AllocConsole 控制台在应用程序退出的时候将会自动结束,当然你也可以调用 Close() 方法在任意时间结束。

评论