2011-01-04 15 views
5

He creado un servicio de Windows, ahora quiero que se actualice automáticamente. He leído sobre la creación de un segundo servicio para hacer eso o un programa diferente, no puedo usar clic, ¿qué hay de myBuild? ¿Alguien lo sabe? ¿Cuál es la mejor manera? ¿Puedo simplemente cambiar ensamblajes?Actualiza silenciosamente un servicio de Windows

Respuesta

5

Si usted quiere que su servicio se ejecute mientras está realizando una actualización, esto es lo que había hecho antes de lograr esto:

  1. Deja tus lógica updateble en una DLL separada.
  2. Cree un dominio de aplicación dentro de su servicio.
  3. Crear supervisor de archivo que activa un suceso siempre se copia ese archivo (se puede utilizar MSFT Ent Lib Actualizaciones)
  4. Descargar la edad DLL mientras que el bloqueo (cola) los hilos que se ejecutan cosas de esa DLL
  5. de carga en el nuevo archivo dll en el dominio de la aplicación.
  6. Deja que tus hilos sepan que puedes seguir procesando.
3
  1. Descargue el nuevo exe y cualquier ensamblaje adicional.
  2. Cambie el nombre de su conjunto existente.
  3. Copie en su nueva ensambladura.
  4. Reiniciar servicio. Puede construir la función de reinicio del servicio en su exe de servicio principal.
  5. Cuando se inicia el servicio, compruebe los archivos renombrados desde el paso 2 y elimínelos para limpiarlos.

Para reiniciar el servicio de hacer

System.Diagnostics.Process.Start 
    (System.Reflection.Assembly.GetEntryAssembly().Location) 

Luego, en el servicio de hacer

private const string _mutexId = "MyUniqueId"; 
    private static Mutex _mutex; 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
     try 
     { 
      bool alreadyRunning = false; 
      try 
      { 
       Mutex.OpenExisting(_mutexId); 
       alreadyRunning = true; 
      } 
      catch (WaitHandleCannotBeOpenedException) 
      { 
       alreadyRunning = false; 
      } 
      catch 
      { 
       alreadyRunning = true;     
      } 
      if (alreadyRunning) 
      { 
       using (ServiceController sc = new ServiceController("MyServiceName")) 
       { 
        sc.Stop(); 
        sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 120)); 
        sc.Start(); 
       } 
       return; 
      } 
     } 
     catch 
     { 
     } 
     _mutex = new Mutex(true, _mutexId); 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
     // Load the service into memory. 
     ServiceBase.Run(ServicesToRun); 
     _mutex.Close(); 
    } 
1

Se podría modificar su servicio de Windows de modo que no es más que un corredor para su aplicación principal, y tiene la funcionalidad para actualizar su aplicación principal.

por lo que tendría:

  • Service.exe: Ejecuta aplicación.exe, supervisa ubicación remota de cambios a aplicación.exe. Envía eventos de inicio/detención a Application.exe

  • Application.exe: lo que solía ser su Service.exe. Recibe eventos de inicio/detención.

+0

... disculpa, probablemente no se explica terriblemente bien. Escribir respuestas de SO a las 3 a.m. probablemente no sea la mejor idea;) –

Cuestiones relacionadas