как выполнить консольное приложение из формы Windows? - PullRequest
13 голосов
/ 07 апреля 2010

Я хочу запустить консольное приложение (например, app.exe) из события загрузки формы Windows. Я пробовал System.Diagnostics.Process.Start (), но после открытия app.exe он закрывает его сразу.

Есть ли способ запустить app.exe и оставить его открытым?

Ответы [ 8 ]

12 голосов
/ 07 апреля 2010

Если вы просто хотите, чтобы окно консоли оставалось открытым, вы можете запустить его с помощью команды:

System.Diagnostics.Process.Start( @"cmd.exe", @"/k c:\path\my.exe" );
3 голосов
/ 07 апреля 2010

Попробуйте сделать это:

        string cmdexePath = @"C:\Windows\System32\cmd.exe";
        //notice the quotes around the below string...
        string myApplication = "\"C:\\Windows\\System32\\ftp.exe\"";
        //the /K keeps the CMD window open - even if your windows app closes
        string cmdArguments = String.Format("/K {0}", myApplication);
        ProcessStartInfo psi = new ProcessStartInfo(cmdexePath, cmdArguments);
        Process p = new Process();
        p.StartInfo = psi;
        p.Start();

Я думаю, это даст вам поведение, за которое вы пытаетесь. Предполагая, что вы не просто пытались увидеть результат в командном окне. Если вы просто хотите увидеть результат, у вас уже есть несколько версий этого ответа. Именно так вы можете запустить свое приложение и держать консоль открытой.

Надеюсь, это поможет. Удачи.

2 голосов
/ 07 апреля 2010

Если app.exe ничего не делает или быстро завершает свою работу (т.е. просто печатает «Hello World» и возвращает), он будет вести себя так, как вы только что объяснили.Если вы хотите, чтобы app.exe оставался открытым после завершения своей работы, поместите в консольное приложение какое-то сообщение о завершении, а затем Console.ReadKey();.

1 голос
/ 07 апреля 2010

Если у вас есть контроль над app.exe, вы должны знать, как он работает, поэтому я предполагаю, что вы не контролируете его внутреннюю работу. В этом случае вы можете попробовать передать флаг справки, который может или не может дать вам больше информации о том, как вызвать app.exe. Попробуйте что-то вроде этого:

private startApp()
{
    string command = " -h"; //common help flag for console apps
    System.Diagnostics.Process pRun;
    pRun = new System.Diagnostics.Process();
    pRun.EnableRaisingEvents = true;
    pRun.Exited += new EventHandler(pRun_Exited);
    pRun.StartInfo.FileName = "app.exe";
    pRun.StartInfo.Arguments = command;
    pRun.StartInfo.WindowStyle =  System.Diagnostics.ProcessWindowStyle.Normal

    pRun.Start();
    pRun.WaitForExit();
}
private void  pRun_Exited(object sender, EventArgs e)
{
    //Do Something Here
}
1 голос
/ 07 апреля 2010

У вас есть одна из двух проблем, учитывая настройки вашего главного / подчиненного приложения:

  1. Ваше главное приложение открывается, отображает форму, которая запускает ведомое приложение и сразу же закрывается, даже если ведомое приложение все еще работает.
  2. Ваше главное приложение открывается, отображается форма, эта форма запускает ведомое приложение, которое немедленно закрывается.

Для первой проблемы вам нужно подождать / заблокировать процесс до завершения (т.е. Process.WaitForExit().

Для второй проблемы, похоже, что ведомое приложение сделало то, что ему нужно (или сгенерировало исключение), и немедленно закрывается. Попробуйте запустить его с теми же параметрами из командной строки и проверьте вывод.

1 голос
/ 07 апреля 2010

app.exe может заканчиваться Console.ReadLine() при условии, что это тоже приложение C #, где вы управляете исходным кодом.

1 голос
/ 07 апреля 2010

Если вы можете изменить код app.exe, просто добавьте Console.In.Read(), чтобы он дождался нажатия клавиши.

0 голосов
/ 07 апреля 2010

Создайте новый текстовый файл, назовите его app.bat и поместите в него:

app.exe
pause

Теперь ваша форма указывает на этот файл летучей мыши.

...