Перезапустите приложение Windows с помощью .NET - PullRequest
9 голосов
/ 15 января 2010

Есть ли способ перезапустить приложение для Windows, написанное на .NET, используя код .NET

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

Ответы [ 3 ]

9 голосов
/ 15 января 2010

Application.Restart () ваш метод:)

Здесь - это еще один ответ StackOverflow, который указывает на пару «бдительных» при использовании этого метода.

5 голосов
/ 15 января 2010
0 голосов
/ 09 апреля 2011

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

Я пытался Application.Restart, но, поскольку он, похоже, использует какой-то механизм, который запускает новый экземпляр, когда он уже запущен, я выбрал другую схему. Я использовал прием, который обрабатывает файловая система, до тех пор, пока процесс, который их создал, не прекратит работу. Итак, из приложения я сбросил файл на диск, а не Dispose() дескриптор. Я использовал этот файл для отправки исполняемого и начального каталога «себя» (для большей гибкости).

Код:

_restartInProgress = true;
string dropFilename = Path.Combine(Application.StartupPath, "restart.dat");
StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite));
sw.WriteLine(Application.ExecutablePath);
sw.WriteLine(Application.StartupPath);
sw.Flush();
Process.Start(new ProcessStartInfo
{
    FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"),
    WorkingDirectory = Application.StartupPath,
    Arguments = string.Format("\"{0}\"", dropFilename)
});
Close();

Close() в конце может привести к закрытию приложения, и дескриптор файла, который я использовал для StreamWriter, будет оставаться открытым до тех пор, пока процесс не прекратится. Тогда ...

Restarter.exe вступает в действие. Он пытается прочитать файл в монопольном режиме, не давая ему получить доступ до тех пор, пока основное приложение не исчезнет, ​​затем запускает основное приложение, удаляет файл и существует. Я думаю, что это не может быть проще:

static void Main(string[] args)
{
    string filename = args[0];
    DateTime start = DateTime.Now;
    bool done = false;
    while ((DateTime.Now - start).TotalSeconds < 30 && !done)
    {
        try
        {
            StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
            string[] runData = new string[2];
            runData[0] = sr.ReadLine();
            runData[1] = sr.ReadLine();
            Thread.Sleep(1000);
            Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] });
            sr.Dispose();
            File.Delete(filename);
            done = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Thread.Sleep(1000);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...