当我尝试在 wpf 中打开它两次时,控制台崩溃了
Posted
技术标签:
【中文标题】当我尝试在 wpf 中打开它两次时,控制台崩溃了【英文标题】:the console crashed when i try to open it twice in wpf 【发布时间】:2017-03-01 18:31:26 【问题描述】:我想在 wpf 中打开一个控制台,我试图在不关闭程序的情况下打开控制台两次,但是在第二次程序崩溃时,我真的不知道为什么,我很乐意提供帮助
using System;
using System.Windows;
using System.Runtime.InteropServices;
namespace WpfApplication1
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
[DllImport("Kernel32")]
public static extern void AllocConsole();
[DllImport("Kernel32")]
public static extern void FreeConsole();
private void button_Click(object sender, RoutedEventArgs e)
AllocConsole();
string x = Console.ReadLine();
FreeConsole();
【问题讨论】:
“程序崩溃” -- 请具体说明。程序以何种方式“崩溃”?它只是停止响应了吗?它抛出异常了吗?它只是消失了吗?哪里有任何类型的错误消息?如果是这样,他们说了什么,确切地?如果有异常,堆栈跟踪是什么?请改进您的问题。 我尝试了您发布的代码,我得到了三种不同的行为:有时它可以正常工作;有时它会挂起控制台,从而挂起整个程序;有时它会在ReadLine()
调用时引发异常:The handle is invalid
。我对控制台 API 的了解不够,无法解释为什么您所做的事情本身是错误的,但很明显这不是您期望使用控制台 API 的方式。此外,我会说即使它有效,这是错误的做法。你有一个 GUI 程序;如果您想显示控制台,请显示您自己的窗口并将其用于此目的。
【参考方案1】:
如果您想继续分配新的控制台,然后为该新控制台使用ReadLine()
,您似乎还需要重新分配Console
类的输入流:
private void button_Click(object sender, RoutedEventArgs e)
AllocConsole();
using (Stream stream = Console.OpenStandardInput())
using (TextReader reader = new StreamReader(stream))
string x = reader.ReadLine();
FreeConsole();
也就是说,我认为你真的走错了方向。控制台窗口是与用户交互的极其有限的方式。这就是为什么我们首先要有 GUI 程序(Winforms、WPF 等)。与在托管程序中混合非托管调用相关的不熟悉错误相比,难度非常小,而且肯定方式困难,您可以为您的程序创建一个窗口,该窗口可以完成控制台窗口所做的所有事情,但做得更好。恕我直言,这确实是正确的方法。
【讨论】:
以上是关于当我尝试在 wpf 中打开它两次时,控制台崩溃了的主要内容,如果未能解决你的问题,请参考以下文章
为什么self.transport.write()写入同一行,即使我在每次调用后引入睡眠后调用它两次?