c# .net windows batch-file application-restart

c# - Reiniciar una aplicación por sí mismo



.net windows (9)

Quiero construir mi aplicación con la función para reiniciarse. Encontré en 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();

Esto no funciona en absoluto ... Y el otro problema es, ¿cómo empezar de nuevo de esta manera? Quizás también haya argumentos para iniciar aplicaciones.

Editar:

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


¿Por qué no solo lo siguiente?

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

Si desea asegurarse de que la aplicación no se ejecute dos veces, use Environment.Exit(-1) que mata el proceso de forma instantánea (lo que no es realmente agradable) o algo así como iniciar una segunda aplicación, que verifique el proceso de la aplicación principal y comienza de nuevo tan pronto como el proceso se va.


¿Por qué no usar

Application.Restart();

??

Más sobre Restart


Mi solución:

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; } } }


Mucha gente está sugiriendo usar Application.Restart. En realidad, esta función rara vez se desempeña como se espera. Nunca he tenido que cerrar la aplicación de la que estoy llamando. Siempre he tenido que cerrar la aplicación a través de otros métodos, como cerrar el formulario principal.

Tienes dos formas de manejar esto. O bien tienes un programa externo que cierra el proceso de llamada y comienza uno nuevo,

o,

tiene el inicio de su nuevo software para eliminar otras instancias de la misma aplicación si se pasa un argumento como reinicio.

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 { } }


Otra forma de hacer esto que se siente un poco más limpia que estas soluciones es ejecutar un archivo por lotes que incluya un retraso específico para esperar a que finalice la aplicación actual. Esto tiene el beneficio adicional de evitar que las dos instancias de aplicación se abran al mismo tiempo.

Ejemplo de archivo por lotes de Windows ("restart.bat"):

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

En la aplicación, agregue este código:

// 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();


Para la solución de aplicación .Net se ve así:

System.Web.HttpRuntime.UnloadAppDomain()

Utilicé esto para reiniciar mi aplicación web después de cambiar los ajustes de aplicación en el archivo myconfig.

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


Uso un código similar al código que probaste al reiniciar aplicaciones. Envío un comando cmd cronometrado para reiniciar la aplicación de esta manera:

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();

El comando se envía al sistema operativo, el ping hace una pausa en la secuencia de comandos durante 2-3 segundos, momento en el que la aplicación ha salido de Application.Exit() , luego el siguiente comando después del ping lo inicia de nuevo.

Nota: El /" pone comillas alrededor de la ruta, en caso de que tenga espacios, que cmd no puede procesar sin comillas.

¡Espero que esto ayude!


Usted tiene la aplicación inicial A, que desea reiniciar. Entonces, cuando quieres matar A, se inicia una pequeña aplicación B, B mata A, luego B comienza A y mata B.

Para iniciar un proceso:

Process.Start("A.exe");

Matar un proceso, es algo como esto.

Process[] procs = Process.GetProcessesByName("B"); foreach (Process proc in procs) proc.Kill();


Winforms tiene el método Restart , que hace precisamente eso. Si está utilizando WPF, simplemente puede agregar una referencia a System.Windows.Forms y llamarla.