Estoy escribiendo un software y tratando de implementar un actualizador automático en él como una aplicación separada. Tengo tanto el software como el actualizador bajo la misma solución.
Cuando hay una actualización disponible desde un servidor, mi programa solicita al usuario que actualice, esta parte funciona.
No llamo a la aplicación de actualización y luego salgo solo del primer programa.
Esto es lo que no tengo:
private void button2_Click(object sender, EventArgs e) { // Update ExecuteAsAdmin("AutoUpdater.exe"); //System.Windows.Forms.Application.Exit(); Process.GetCurrentProcess().Kill(); } public void ExecuteAsAdmin(string fileName) { Process proc = new Process(); proc.StartInfo.FileName = fileName; proc.StartInfo.UseShellExecute = true; proc.StartInfo.Verb = "runas"; proc.Start(); }
Esto inicia con éxito el AutoUpdater.exe pero luego existe tanto el primer programa como el AutoUpdater.exe, este último no debe salirse ya que debería hacer la actualización.
¿Cómo salir de un solo programa de la misma solución?
Agregue el código para cerrar la aplicación principal en el actualizador. Conoce el nombre del proceso, por lo que debería ser bastante fácil. De esta manera, también puede verificar que el actualizador comience a ejecutarse antes de que se cierre la aplicación principal.
El código a continuación está tomado de esta respuesta: https://stackoverflow.com/a/49245781/3279876 y no lo he probado yo mismo.
Process[] runningProcesses = Process.GetProcesses(); foreach (Process process in runningProcesses) { // now check the modules of the process foreach (ProcessModule module in process.Modules) { if (module.FileName.Equals("MyProcess.exe")) { process.Kill(); } else { enter code here if process not found } } }
Esto funciona con una aplicación mínima de winforms en mi sistema:
System.Diagnostics.Process p = System.Diagnostics.Process.Start("notepad.exe"); Application.Exit();
pero también esto:
ExecuteAsAdmin("notepad.exe"); Application.Exit()