cierre la aplicación .NET antes de desinstalar

He heredado una aplicación .NET existente (C#) que consta de un servicio de Windows y una GUI de control. La aplicación GUI, el servicio y el proyecto de instalación están integrados en una solución vs2010. La GUI es un formulario de Windows que se inicia mediante una clase principal estática, porque debe residir en la bandeja cuando se minimiza. La GUI tiene un temporizador que verifica periódicamente si el servicio está activo y habilita/deshabilita las entradas del menú emergente "iniciar servicio" y "detener servicio" en consecuencia. El problema es que cuando intento desinstalarlo, el servicio se elimina antes que la GUI y timer_Tick en la GUI genera una excepción porque no encuentra el servicio. Aquí está el código utilizado por la clase principal para iniciar la aplicación:

static class Program
{
    /// <summary>
    /// Punto di ingresso principale dell'applicazione.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
}

El código ejecutado por el temporizador (yo agregué el bloque try/catch para detectar la excepción):

private void tmrCheckService_Tick(object sender, EventArgs e)
    {
        try
        {
            ServiceController service = new ServiceController("MyService");
            if (service.Status == ServiceControllerStatus.Running)
            {
                startToolStripMenuItem.Enabled = false;
            }
            else
            {
                startToolStripMenuItem.Enabled = true;
            }

            service = null;
        }
        catch (InvalidOperationException oEx)
        {
            //tmrCheckService.Stop();
            //this.Close();
        }
    }

Si elimino el comentario del código en el bloque catch, la aplicación se cierra y la desinstalación se realiza correctamente. No estoy seguro de que esta sea la mejor manera de gestionar el error. Preferiría administrar el proceso de desinstalación, haciendo que la GUI se detenga y elimine antes de que se elimine el servicio, pero no puedo encontrar la manera de hacerlo. Una posible solución que he pensado es anular el método on beforeuninstall del instalador del servicio, encontrar el proceso adjunto a mi aplicación GUI y eliminarlo mediante programación. Si esta solución es mejor, ¿cómo podría lograrlo? Gracias.

preguntado el 22 de mayo de 12 a las 10:05

En un escenario de "múltiples usuarios registrados en la misma máquina" (por ejemplo, si está habilitado el cambio rápido de usuario, o escritorios remotos, etc.), ¿podría haber múltiples instancias de la aplicación GUI en ejecución? -

@Damien_The_Unbeliever: nada impide que eso suceda, pero no es obligatorio. -

1 Respuestas

Creo que si ha desinstalado el servicio, es probable que se produzca una excepción. Deberá manejar una excepción. su única otra opción es alguna forma de notificación de desinstalación del servicio a la interfaz de usuario, pero eso parece demasiado complejo. Simplemente maneje cualquier excepción y ordene cualquier recurso

contestado el 22 de mayo de 12 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.