我继承了一个现有的 .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 beforeuninstall 方法,找到附加到我的 GUI 应用程序的进程并以编程方式将其终止。如果这个解决方案更好,我怎么能实现它?谢谢你。