Подтвердить что ты не робот

Перезапустить приложение самостоятельно

Я хочу, чтобы мое приложение с функцией перезапустило себя. Я нашел на codeproject

ProcessStartInfo Info=new ProcessStartInfo();
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+
               Application.ExecutablePath;
Info.WindowStyle=ProcessWindowStyle.Hidden;
Info.CreateNoWindow=true;
Info.FileName="cmd.exe";
Process.Start(Info); 
Application.Exit();

Это не работает вообще... И другая проблема в том, как начать это снова так? Возможно, есть и аргументы для запуска приложений.

Edit:

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=31454&av=58703
4b9b3361

Ответ 1

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

ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C ping 127.0.0.1 -n 2 && \"" + Application.ExecutablePath + "\"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
Application.Exit(); 

Команда отправляется в ОС, пинг приостанавливает script на 2-3 секунды, и к этому времени приложение выходит из Application.Exit(), затем следующая команда после пинга снова запускает его.

Примечание. \" помещает кавычки по пути, если он имеет пробелы, которые cmd не может обрабатывать без кавычек.

Надеюсь, это поможет!

Ответ 2

Почему бы не использовать

Application.Restart();

??

Подробнее о Restart

Ответ 3

Почему не только следующее?

Process.Start(Application.ExecutablePath); 
Application.Exit();

Если вы хотите быть уверенным, что приложение не запускается дважды, используйте Environment.Exit(-1), который мгновенно убивает процесс (не совсем красивый) или что-то вроде запуска второго приложения, которое проверяет процесс основного приложения и запускает его снова, как только процесс исчезнет.

Ответ 4

У вас есть начальное приложение A, которое нужно перезапустить. Итак, когда вы хотите убить A, запускается небольшое приложение B, B убивает A, затем B запускает A и убивает B.

Чтобы запустить процесс:

Process.Start("A.exe");

Чтобы убить процесс, что-то вроде этого

Process[] procs = Process.GetProcessesByName("B");

foreach (Process proc in procs)
   proc.Kill();

Ответ 5

Winforms имеет метод Application.Restart(), который делает именно это. Если вы используете WPF, вы можете просто добавить ссылку на System.Windows.Forms и вызвать его.

Ответ 6

Многие люди предлагают использовать Application.Restart. В действительности эта функция редко работает так, как ожидалось. Я никогда не закрывал приложение, из которого я его вызываю. Я всегда должен был закрыть приложение с помощью других методов, таких как закрытие основной формы.

У вас есть два способа справиться с этим. У вас либо есть внешняя программа, которая закрывает вызывающий процесс и запускает новый,

или,

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

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            try
            {
                if (e.Args.Length > 0)
                {
                    foreach (string arg in e.Args)
                    {
                        if (arg == "-restart")
                        {
                            // WaitForConnection.exe
                            foreach (Process p in Process.GetProcesses())
                            {
                                // In case we get Access Denied
                                try
                                {
                                    if (p.MainModule.FileName.ToLower().EndsWith("yourapp.exe"))
                                    {
                                        p.Kill();
                                        p.WaitForExit();
                                        break;
                                    }
                                }
                                catch
                                { }
                            }
                        }
                    }
                }
            }
            catch
            {
            }
        }

Ответ 7

Другим способом сделать это, который немного чище, чем эти решения, является запуск пакетного файла, который включает определенную задержку для ожидания завершения текущего приложения. Это дает дополнительное преимущество для предотвращения одновременного открытия двух экземпляров приложения.

Пример командного файла окон ( "restart.bat" ):

sleep 5
start "" "C:\Dev\MyApplication.exe"

В приложении добавьте этот код:

// Launch the restart batch file
Process.Start(@"C:\Dev\restart.bat");

// Close the current application (for WPF case)
Application.Current.MainWindow.Close();

// Close the current application (for WinForms case)
Application.Exit();

Ответ 8

Мое решение:

        private static bool _exiting;
    private static readonly object SynchObj = new object();

        public static void ApplicationRestart(params string[] commandLine)
    {
        lock (SynchObj)
        {
            if (Assembly.GetEntryAssembly() == null)
            {
                throw new NotSupportedException("RestartNotSupported");
            }

            if (_exiting)
            {
                return;
            }

            _exiting = true;

            if (Environment.OSVersion.Version.Major < 6)
            {
                return;
            }

            bool cancelExit = true;

            try
            {
                List<Form> openForms = Application.OpenForms.OfType<Form>().ToList();

                for (int i = openForms.Count - 1; i >= 0; i--)
                {
                    Form f = openForms[i];

                    if (f.InvokeRequired)
                    {
                        f.Invoke(new MethodInvoker(() =>
                        {
                            f.FormClosing += (sender, args) => cancelExit = args.Cancel;
                            f.Close();
                        }));
                    }
                    else
                    {
                        f.FormClosing += (sender, args) => cancelExit = args.Cancel;
                        f.Close();
                    }

                    if (cancelExit) break;
                }

                if (cancelExit) return;

                Process.Start(new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath,
                    Arguments = commandLine.Length > 0 ? string.Join(" ", commandLine) : string.Empty
                });

                Application.Exit();
            }
            finally
            {
                _exiting = false;
            }
        }
    }

Ответ 9

Для прикладного решения .Net выглядит следующим образом:

System.Web.HttpRuntime.UnloadAppDomain()

Я использовал это для перезапуска моего веб-приложения после изменения AppSettings в файле myconfig.

System.Configuration.Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~");
configuration.AppSettings.Settings["SiteMode"].Value = model.SiteMode.ToString();
configuration.Save();