C# WPF控制台应用程序完成后不会返回提示

C# WPF控制台应用程序完成后不会返回提示,c#,wpf,command-line,C#,Wpf,Command Line,我有一个WPF应用程序,当传递命令行参数时,它作为命令行应用程序运行。要显示/获取命令行窗口,我使用以下代码 当我运行应用程序时,一切都按预期运行。如果我在应用程序运行期间向控制台写入任何内容,那么应用程序不会自动退出控制台,我必须按“回车”键或基本上调用某种ReadLine-注意,我根本没有在应用程序中使用ReadLine。事实上,我只能使用这个简单的代码来实现这种行为。我如何防止应用程序运行后“按enter”的要求 public static void Main(string[] args)

我有一个WPF应用程序,当传递命令行参数时,它作为命令行应用程序运行。要显示/获取命令行窗口,我使用以下代码

当我运行应用程序时,一切都按预期运行。如果我在应用程序运行期间向控制台写入任何内容,那么应用程序不会自动退出控制台,我必须按“回车”键或基本上调用某种
ReadLine
-注意,我根本没有在应用程序中使用
ReadLine
。事实上,我只能使用这个简单的代码来实现这种行为。我如何防止应用程序运行后“按enter”的要求

public static void Main(string[] args)
{
    if (args.Length == 0)
    {
        App app = new App();
        app.Run(new MainWindow());
    }
    else
    {
        // attach to an parent process console
        if (!NativeMethods.AttachConsole(-1))
        {
            // allocate a new console
            NativeMethods.AllocConsole();
        }

        Console.WriteLine("hey");

        NativeMethods.FreeConsole();
    }
}
我对Alloc/Attach/Free使用以下方法。注意:根据Rohit的建议,我在
WriteLine
之后直接尝试了
FreeConsole
,但仍然没有帮助

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

[DllImport("kernel32.dll")]
private static extern bool AttachConsole(int pid);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern int FreeConsole();

每当您完成对控制台的写入操作时,请使用
FreeConsole()
方法将连接的控制台释放到您的应用程序中

if (!Startup.AttachConsole(-1))
{ 
    // Attach to an parent process console
    Startup.AllocConsole(); // Alloc a new console
}

Console.WriteLine("hey");
Startup.FreeConsole();

模式主窗口完成后,使用类似以下代码清理所有应用程序资源:

    [STAThread()]
    internal static void Main()
    {
        // [Your startup code here]

        Application app = new Application();
        app.DispatcherUnhandledException += DispatcherUnhandledException;
        app.MainWindow = new MainWindow();
        app.MainWindow.ShowDialog();

        Console.WriteLine("Terminating...");
        Startup.FreeConsole();

        // http://msdn.microsoft.com/en-us/library/ms597014(v=vs.110).aspx
        app.Shutdown(0);      // <-- or Application.Current.Shutdown(0);

        // http://msdn.microsoft.com/en-us/library/system.environment.exit.aspx
        Environment.Exit(0);  // <-- a bit redundant however
    }
[STAThread()]
内部静态空隙总管()
{
//[此处是您的启动代码]
应用程序app=新应用程序();
app.dispatchernhandledException+=dispatchernhandledException;
app.MainWindow=新的主窗口();
app.MainWindow.ShowDialog();
控制台写入线(“终止…”);
Startup.FreeConsole();
// http://msdn.microsoft.com/en-us/library/ms597014(v=vs.110).aspx

app.Shutdown(0);//当句柄由
GetStdHandle(STD\u OUTPUT\u handle)获取时,问题似乎是由
Console.Out
的延迟初始化造成的 要等待提示返回并将控制台输出成功传输到日志,需要使用
start/b/wait myGuiApp>mylog.txt启动应用程序

所有信用都归arx所有:
我遇到了同样的问题,完全同意Cris的调查结果

更仔细地观察控制台,我意识到在运行应用程序后立即在控制台中打印提示。 在提示后打印输出文本

所以基本上,按enter键只会打印另一个空提示

例如,带有控制台的MyWpfApp.WriteLine(“嘿”)

看起来是这样的:

C:>MyWpfApp

C:嘿

这里没有新的空提示

控制台实际上已经显示了提示符,但随后添加了完整的输出(即使有多行输出,这使得更难意识到提示符是在它们之前打印的)


因此,应用程序的执行似乎没有完成,但事实上,该过程已经完成,控制台中的任何进一步的按键都会直接发送到cmd。

我尝试了这个方法,但它没有做任何事情……我将用使用的代码更新我的问题可能是重复的:我没有实际创建应用程序和控制台,我有选择地选择。我将更新我看到了一个带有更多代码的问题。尽管如此,Environment.Exit(0)应该为您执行必要的清理。不幸的是,它仍然不起作用…我的控制台应用程序不会返回命令提示,除非我在以后按enter键。您没有按Ctrl-F5来运行此操作,是吗?我刚刚创建了一个测试项目并使用了您的代码,但没有得到相同的结果。控制台立即消失显示“hey”后为y。