【问题标题】:the console crashed when i try to open it twice in wpf当我尝试在 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 程序;如果您想显示控制台,请显示您自己的窗口并将其用于此目的。

标签: c# wpf forms kernel32


【解决方案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 等)。与在托管程序中混合非托管调用相关的不熟悉错误相比,难度非常小,而且肯定方式困难,您可以为您的程序创建一个窗口,该窗口可以完成控制台窗口所做的所有事情,但做得更好。恕我直言,这确实是正确的方法。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多