Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF项目中实现命令行运行_C#_Wpf - Fatal编程技术网

C# 在WPF项目中实现命令行运行

C# 在WPF项目中实现命令行运行,c#,wpf,C#,Wpf,我想在WPF项目中实现命令行运行。App.cs中的入口点已更改。但控制台只会闪烁然后消失。如何解决这个问题?谢谢 public class App : System.Windows.Application { [STAThread] static void Main(string[] args) { if (args.Length > 0) {// Commandline run mode // Command

我想在WPF项目中实现命令行运行。App.cs中的入口点已更改。但控制台只会闪烁然后消失。如何解决这个问题?谢谢

public class App : System.Windows.Application
{
    [STAThread]
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {// Commandline run mode
            // Command line given, console from console
            Console.WriteLine("In cmd line mode");
            AllocConsole();
            CmdLineRun.ParseArgs(args);
            CmdLineRun.CmdRun();
        }
        else
        {// GUI mode
            GUIMain();
        }
    }

    static void GUIMain()
    {
        App app = new App();
        app.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
        app.Run();
    }

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AllocConsole();
}

当您使用
alloconsole
创建一个新的控制台窗口时,它只会在进程仍处于活动状态时停留。要防止出现这种情况,您有两种选择:

  • 在用户提供一些输入之前,不要实际终止您的进程。这是您的陈词滥调“按任意键继续”选项,您将在
    CmdRun
    方法返回后执行此操作。控制台窗口仍将消失,但只有在您告诉它时才会消失

  • 使用预先存在的控制台。如果总是从命令行运行应用程序,则不需要创建新的控制台窗口。相反,使用
    AttachConsole
    方法将stdin/stdout附加到已经存在的stdin/stdout

  • 最好的选择通常是先尝试
    附加控制台(-1)
    (-1表示
    附加父进程
    )。如果返回0,那么您的父进程没有控制台,或者您无法连接到它。然后,您可以使用
    alloconsole
    ,并在关机后继续使用它


    这并不特定于WPF,当您尝试在同一应用程序中混合控制台和GUI代码时,这是一个问题。如果您的应用程序是为CUI子系统编译的,则通过指定“控制台应用程序”,Windows将为您处理此问题,但默认情况下您不会获得消息队列,窗口化UI将失败。如果您的应用程序是为GUI子系统编译的,那么通过指定“windows应用程序”,您将获得一个消息队列,而不是控制台处理。让Windows处理GUI部分和手动管理控制台是这两个选项中最简单的一个。

    您的CmdLineRun类是什么样子的?Michael考虑了详细的答案。非常适合我的问题。