Запустить консольное приложение на c #?

Возможный дубликат:
Как запустить консольное приложение C # со скрытой консолью.

через библиотеку классов, как мне запустить консольное приложение в фоновом режиме для выполнения задачи, а затем сообщить моему методу о завершении обработки?


person 001    schedule 10.02.2011    source источник
comment
А под консольным приложением, я полагаю, вы имеете в виду исполняемый файл окна dos?   -  person Brad Christie    schedule 10.02.2011
comment
вы хотите, чтобы он вернулся в асинхронный режим или дождался завершения работы приложения?   -  person Joe    schedule 10.02.2011
comment
001, вы должны попытаться отметить больше ответов, которые вам дают люди, как принятые. Это полезно для тех, кто сталкивается с вашим вопросом, а также дает должное тем, кто вам помогает.   -  person Will Vousden    schedule 10.02.2011


Ответы (3)


Для этого можно использовать класс Process.

Вот пример:

// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "your application path";
p.Start();
// Do not wait for the child process to exit before
// reading to the end of its redirected stream.
// p.WaitForExit();
// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();

Существует также свойство HasExited, чтобы проверить, процесс завершен.

вы можете использовать это так:

if (p.HasExited)...

или вы можете привязать EventHandler к событию Exited .

person Shekhar_Pro    schedule 10.02.2011

Если вас устраивает ожидание завершения работы вашего приложения, используйте proc.WaitForExit (), как в ответе Шекхара. Если вы хотите, чтобы он работал в фоновом режиме, а не ждал, используйте событие Exited.

Process proc =
    new Process
    {
        StartInfo =
        {
            FileName = Application.StartupPath +  @"your app name",
            Arguments = "your arguments"
        }
    };

proc.Exited += ProcessExitedHandler;

proc.Start();

И когда это будет сделано, вы можете проверить коды ошибок:

if (proc.ExitCode == 1)
{
    // successful
}
else
{
    // something else
}
person Joe    schedule 10.02.2011

Я рискну здесь, но я думаю, вы имеете в виду полностью скрыть окно консольного приложения.

В этом случае вы можете добиться этого с помощью P / Invoking.

Я врал. Исходный код, который я опубликовал, просто отключает кнопку «X» в трее. Извините за путаницу ...

WinForms.ShowWindow(consoleWindow, NativeConstants.SW_HIDE)

    [DllImport("user32.dll")]
    public static extern Boolean ShowWindow(IntPtr hWnd, Int32 show);

И операторы P / Invoke здесь:

    /// <summary>
    ///     The EnableMenuItem function enables, disables, or grays the specified menu item.
    /// </summary>
    /// <param name="hMenu"></param>
    /// <param name="uIDEnableItem"></param>
    /// <param name="uEnable"></param>
    /// <returns></returns>
    [DllImport("user32.dll")]
    public static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetConsoleWindow();

    /// <summary>
    ///     The GetSystemMenu function allows the application to access the window menu (also known as the system menu or the control menu) for copying and modifying.
    /// </summary>
    /// <param name="hWnd"></param>
    /// <param name="bRevert"></param>
    /// <returns></returns>
    [DllImport("user32.dll")]
    public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

Исходный код

    private static IntPtr hWndConsole = IntPtr.Zero;
    private static IntPtr hWndMenu = IntPtr.Zero;

    public static void Main(string[] args)
    {
        hWndConsole = WinForms.GetConsoleWindow();
        if (hWndConsole != IntPtr.Zero)
        {
            hWndMenu = WinForms.GetSystemMenu(hWndConsole, false);

            if (hWndMenu != IntPtr.Zero)
            {
                WinForms.EnableMenuItem(hWndMenu, NativeConstants.SC_CLOSE, (uint)(NativeConstants.MF_GRAYED));
            }
        }
    }
person Zack    schedule 10.02.2011