卸载前关闭.NET应用程序

时间:2012-05-22 09:57:33

标签: .net windows-installer

我继承了一个现有的.NET应用程序(C#),它由一个Windows服务和一个控制GUI组成。 GUI应用程序,服务和安装项目嵌入在vs2010解决方案中。 GUI是一个由静态主类启动的Windows窗体,因为它在最小化时必须驻留在托盘中。 GUI具有定时器,该定时器定期检查服务是否有效并相应地启用/禁用弹出菜单“启动服务”和“停止服务”条目。 问题是当我尝试卸载时,在GUI之前删除服务,并且GUI中的timer_Tick引发异常,因为它找不到该服务。 以下是主类用于启动应用程序的代码:

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

由计时器执行的代码(我添加了try / catch块以捕获异常):

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

如果我取消注释catch块中的代码,则应用程序退出并且卸载成功。 我不确定这是管理错误的最佳方法。我更愿意管理卸载过程,在删除服务之前停止并删除GUI,但我找不到这样做的方法。 我认为可能的解决方案是覆盖服务安装程序的on beforeinstall方法,找到附加到我的GUI应用程序的进程并以编程方式终止它。如果这个解决方案更好,我怎么能实现它? 谢谢。

1 个答案:

答案 0 :(得分:0)

我认为如果您已卸载该服务,则可能会出现异常..您需要处理的异常。你只有其他选择是从服务到ui的某种形式的卸载通知,但这似乎过于复杂。只需处理任何异常并整理任何资源