我已經繼承了由Windows服務和控制GUI組成的現有.NET應用程序(C#)。 GUI應用程序,服務和安裝項目都嵌入在vs2010解決方案中。 GUI是一個由靜態主類啓動的窗體,因爲它必須在最小化時駐留在托盤中。 GUI有一個定時器,定期檢查服務是否處於活動狀態,並相應地啓用/禁用彈出式菜單「啓動服務」和「停止服務」條目。 問題是,當我嘗試卸載時,服務在GUI和GUI中的timer_Tick之前被刪除,因爲它找不到該服務。 這裏是使用主類來啓動應用程序的代碼:在卸載之前關閉.NET應用程序
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,但我找不到這樣做的方法。 我認爲可能的解決方案是覆蓋服務安裝程序的beforeuninstall方法,找到附加到我的GUI應用程序的進程並以編程方式將其終止。如果這個解決方案更好,我怎麼能實現它? 謝謝。
在「登錄到同一臺計算機上的多個用戶」情況下(例如,如果啓用了快速用戶切換或遠程桌面等),可能會有*多個* GUI實例應用運行? –
@Damien_The_Unbeliever: 沒有什麼可以防止這種情況發生,但它不是強制性的。 – Alex