C #: Как запустить пакетный процесс после выхода из программы (не вызывается во время нее) - PullRequest
4 голосов
/ 27 августа 2010

У меня есть следующие настройки:

MainApp.exe проверяет наличие обновлений, загружает последние обновления. Проблема в том, что иногда обновления представляют собой библиотеки DLL, которые в настоящее время использует MainApp.exe. Итак, я подумал, может быть, просто сбросить все файлы в папку Update (temp) и, когда программа выйдет, запустить командный файл, который перезаписывает библиотеки DLL и затем перезапускает программу. Это обычное дело, я видел, как это делается (например, Spybot Search and Destroy).

Мой вопрос: как заставить программу запускать процесс ПОСЛЕ того, как она выходит?

В качестве альтернативы, можно ли называть пакетную программу ВО ВРЕМЯ программы, но подождать, пока ПОСЛЕ закрытия программы начнется ее фактическая партия?

О, и я сомневаюсь, что в приложении WPF все будет по-другому, но если это так ... я пишу свое приложение как приложение WPF.

P.S. Я думаю, что в Unix нечто подобное является Forking Exec?

Ответы [ 3 ]

8 голосов
/ 27 августа 2010

В первом приложении передайте во второе приложение свой идентификатор процесса:

using System.Diagnostics;

static void Main(){
    /* perform main processing */
    Process.Start("secondapp.exe", Process.GetCurrentProcess().Id.ToString());
}

В дочернем процессе дождитесь завершения первого:

using System.Diagnostics;

static void Main(string[] args){
    Process.GetProcessById(int.Parse(args[0])).WaitForExit();
    /* perform main processing */
}
2 голосов
/ 27 августа 2010

Вы можете попробовать запустить второй процесс из события Exit приложения wpf.[App.Xaml.cs]

public partial class App : Application
{
    public App()
    {
        this.Exit += (s, e) =>
            {
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo = new System.Diagnostics.ProcessStartInfo("notepad.exe");
                p.Start();
            };
    }
}
0 голосов
/ 06 августа 2015

Почему бы и нет:

1) создать приложение WPF и в соответствии с тем, что происходит в приложении WPF, установить код выхода в приложении WPF (например, Application.Current.Shutdown (123) устанавливает% errorlevelПеременная% в строке cmd в 123)

2) создает основной пакет (main.cmd), который будет выполнять весь контроль:


Содержимое main.cmd:

@echo off

rem *** Start the WPF app here  and wait until it Closes ****
:Start_WPF
start /wait wpf-app.exe

rem *** Assuming that exitcode 123 from your WPF app means: don't do any update, jump to end of main.cmd and do nothing ***
if "%errorlevel%"=="123" goto endofbatch

rem *** Update your app by overwriting formerly blocked DLLs ***

rem // insert update copy steps here //

rem *** Restart your WPF app by Looping back to Start_WPF ***
goto Start_WPF

rem *** End of main.cmd ***
:endofbatch

3) вы запускаете только основной Batch.cmd, который выполняет все управление.

Преимущества этого подхода:

  1. Вам нужна только 1 партия и одно приложение WPF
  2. Вы можете очень легко контролировать в одном пакете, что должно происходить при определенных условиях.Действия выбираются в приложении WPF
  3. Вы можете выполнить столько циклов обновления, сколько необходимо, и затем выйти

Подсказка: если вам не нравится, когда черное окно CMD остается открытым, выпридется скрыть это с некоторыми Действиями, взятыми из приложения WPF.

С уважением,

Майкл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...