当我尝试在 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()写入同一行,即使我在每次调用后引入睡眠后调用它两次?

使用 CEFSharp Web 浏览器的 WPF 应用程序在 clickonce 版本中崩溃

QSpacerItem 在实例化两次时使 pyQT 崩溃

在地图项目上单击两次时,片段中的地图会在滑动抽屉中崩溃

Xcode 4.6.2 应用程序在每秒运行一次时崩溃

Xcode 4.6.2 应用程序在每秒运行一次时崩溃