2009-06-17 16 views
9

Estoy tratando de poner en marcha una aplicación de actualización externa para una plataforma que he desarrollado. La razón por la que me gustaría iniciar esta actualización es porque mi utilidad de configuración, que maneja las actualizaciones y la configuración de la licencia para la plataforma, ha compartido dependencias con otros ensambles en la carpeta donde se implementará la actualización. Entonces, aunque puedo cambiar el nombre de la utilidad de configuración y sobrescribirla al implementar la actualización, no puedo cambiar el nombre ni sobrescribir las DLL de las que depende. Por lo tanto, la aplicación de actualización externa.Cómo crear un proceso que sobrevive a su matriz

estoy manejando toda la lógica de la recolección de actualización en la utilidad de configuración, a continuación, intentar iniciar el programa de actualización para manejar la copia del archivo actual/operaciones de sobreescritura. Obviamente, debido a los problemas de archivos en uso, necesito que la utilidad de configuración se cierre justo después de que comience el actualizador.

El problema que tengo es que estoy usando el método estándar Process.Start para iniciar el actualizador, y tan pronto como se cierra la utilidad de configuración, también se elimina el proceso del actualizador.

¿Hay alguna manera de que pueda crear un proceso que sobrevive a su padre, o lanzar una aplicación externa que puede funcionar más allá del programa que lo lanzó?

EDIT:

Al parecer, en mi aplicación de actualización, que calcularon mal el número de argumentos de línea de comandos que se pasan a la misma. Debido a esto, el actualizador se cerraría inmediatamente. Interpreté erróneamente que esto significa que la aplicación lanzadora estaba matando el proceso "hijo", cuando en realidad no era así.

Las respuestas a continuación son correctas.

+0

Sé que es un tipo de pensamiento retrógrado, pero ¿podría tener un proceso que todo su trabajo es administrar a partir de la utilidad de configuración y su aplicación? De esta forma, podría actualizar tanto la aplicación como la utilidad de configuración (si fuera necesario) por separado y no tendría que preocuparse por los procesos secundarios que mueren con sus padres (ya que el padre siempre se ejecutará). –

+0

Tuve un error en mi código de actualización que lo obligó a salir de inmediato. Supuse que esto era del proceso de "lanzamiento" cerrándolo. He actualizado mi mensaje en consecuencia. ¿Hay alguna forma de darme un representante negativo como autocastigo por cometer un error tan ridículo? –

+0

¿Podemos suponer que estás usando C#/.net/Win32 y no C#/Mono/* nix? No sé si Process funciona de forma idéntica en todos los entornos. – quillbreaker

Respuesta

11

¿Podría compartir algún código, por favor? Parece que el problema que está viendo tiene un motivo diferente porque la clase Process no matará ningún proceso que se haya iniciado utilizando Process.Start cuando finaliza su aplicación.

Ver este programa de ejemplo simple, la calculadora permanecerá abierta:

using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Process.Start(@"C:\windows\system32\calc.exe"); 
    } 
} 
+0

Tiene toda la razón, mis suposiciones fueron nubladas por la velocidad, desafortunadamente. He actualizado mi pregunta en consecuencia. –

5

No hay ninguna razón por la que un proceso iniciado con Process.Start muera automáticamente cuando sale el iniciador. Supongo que estás haciendo algo extraño en el actualizador.

He escrito un actualizador haciendo exactamente este tipo de cosas antes, y está bien.

Por ejemplo:

Launcher.cs:

using System; 
using System.Diagnostics; 

class Launcher 
{ 
    static void Main() 
    { 
     Console.WriteLine("Launching launchee"); 
     Process.Start("Launchee.exe"); 
     Console.WriteLine("Launched. Exiting"); 
    } 
} 

Launchee.cs:

using System; 
using System.Threading; 

class Launchee 
{ 
    static void Main() 
    { 
     Console.WriteLine("  I've been launched!"); 
     Thread.Sleep(5000); 
     Console.WriteLine("  Exiting..."); 
    } 
} 

Compilar los dos, por separado, y ejecutar Launcher.exe. El proceso "launchee" definitivamente dura más que el iniciador.

+0

La utilidad de configuración que inicia el actualizador es una aplicación de formularios de Windows, ¿podría eso tener algo que ver con lo que estoy viendo? –

+0

Estoy haciendo algo similar, mi consola está iniciando un proceso java que tiene una conexión abierta vía socket, e incluso después de que el método principal de la aplicación de consola devuelve el valor (int return type) la consola no se cierra . Supongo hasta que el proceso de java se está ejecutando. ¿algunas ideas? –

+0

@KyloRen: Sin un [mcve], realmente no. Sugiero que publiques una nueva pregunta de forma que podamos reproducirla. –

0

Es sólo una idea de mi memoria de niebla, pero creo recordar que tiene una discusión hace un tiempo que cuando el método es Process.Start llamado desde Formulario que el proceso engendrado tiene algún tipo de dependencia (no estoy seguro de qué, por qué o cómo, la memoria es un poco borrosa).

Para resolverlo, se configuró una marca que en realidad se llamó desde el método Main() de la aplicación después de salir del formulario/aplicación principal y que si el proceso se inició desde el método Main(), todo salió bien esta bien

Solo un pensamiento, como he dicho, esto es puramente de memoria, pero algunos de los ejemplos publicados aquí todos siendo invocados desde el método Main() de una aplicación de consola parecían triturar algo.

Espero que todo salga bien para ti.

+1

No pude reproducir tal comportamiento y realmente me sorprendería si este fuera el caso. Normalmente, un proceso secundario no se dará cuenta si su padre muere (y esto es algo relacionado con el sistema operativo) a menos que haya implementado un comportamiento especial dentro del proceso principal para matar a todos los hijos. –

+0

Tuve la misma suposición, aparentemente nuestros recuerdos están usando algún tipo de IPC psíquico o algo :) –

Cuestiones relacionadas