我在我的WPF应用程序中使用控制台打印出调试信息。控制台打开如下:
static class DebugConsole //Console window handling class
{
[DllImport("Kernel32")]
private static extern bool AllocConsole();
[DllImport("Kernel32")]
private static extern bool FreeConsole();
[DllImport("Kernel32")]
private static extern IntPtr GetConsoleWindow();
[DllImport("Kernel32")]
private static extern int GetConsoleOutputCP();
public static bool HasConsole
{
get { return GetConsoleWindow() != IntPtr.Zero; }
}
static public void Open() //Open console window
{
AllocConsole();
Console.WriteLine("test");
}
}
..同时在编辑的另一部分......
public MainWindow() //This gets executed when the application starts
{
DebugConsole.Open();
InitializeComponent();
}
当我使用上面的代码启动应用程序时,一切都按预期工作。打开控制台窗口,在控制台中打印出“test”字样。
但是,如果我将MainWindow()代码更改为:
public MainWindow() //This gets executed when the application starts
{
Console.WriteLine("test1");
DebugConsole.Open();
InitializeComponent();
}
并运行应用程序......
预期输出:控制台打开,它将包含两行文字
test1
test
实际输出:控制台打开,根本不包含任何文本。事实上,我可以在代码中使用Console.WriteLine,然后控制台保持为空。只有在打开控制台之前没有使用Console.WriteLine时,它才有效。
为什么会这样?我该如何解决?
答案 0 :(得分:0)
初始化控制台后打印。切换Console.WriteLine("test1")
和DebugConsole.Open()
修改强>
在没有初始化控制台的情况下使用Console.Writeline
时,我认为它返回NullStream()
(就像在Unix上将数据重定向到null时一样)但是当你调用open
时你的写方法使用真实的标准输出。
因此默认使用的流是NullStream(),否则它是标准输出。
检查reference source