2012-05-25 143 views
1

當我的服務安裝時,我有一個處理程序在安裝後啓動服務。卸載時自動停止Windows服務

private void InitializeComponent() 
{ 
    ... 
    this.VDMServiceInstaller.AfterInstall += ServiceInstaller_AfterInstall; 
} 


private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e) 
{ 
    ServiceController sc = new ServiceController("MyService"); 
    sc.Start(); 
} 

我想停止該服務被卸載之前,所以我增加了一個額外的處理程序的InitializeComponent()。

this.ServiceInstaller.BeforeUninstall += ServiceInstaller_BeforeUninstall; 

,並添加了功能:

private void ServiceInstaller_BeforeUninstall(object sender, InstallEventArgs e) 
{ 
    try 
    { 
     ServiceController sc = new ServiceController("MyService"); 
     if (sc.CanStop) 
     { 
      sc.Stop(); 
      sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped); 
     } 
    } 
    catch (Exception exception) 
    {} 
} 

但服務不卸載前停止。我是否正確使用ServiceController.Stop()函數?

回答

1

將類似下面的幫助你:

protected override void OnBeforeUninstall(IDictionary savedState) 
    { 
     ServiceController controller = new ServiceController("ServiceName"); 

     try 
     { 

      if(controller.Status == ServiceControllerStatus.Running | controller.Status == ServiceControllerStatus.Paused) 
      { 
      controller.stop(); 
      } 
      controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0,0,0,15)); 

      controller.Close(); 
     } 
     catch(Exception ex) 
     { 
      EventLog log = new EventLog(); 
      log.WriteEntry("Service failed to stop"); 
     } 

     finally 
     { 
      base.OnBeforeUninstall(savedState); 
     } 
    } 
+0

不起作用。它幾乎就像該函數不會被調用,因爲該函數也應該引發BeforeUninstall事件。 –

0

這是我試圖阻止窗口:我已經測試了所有替代現有

Locked files dialog

,並執行他們沒有在提示關閉應用程序的對話框出現之前。

甚至沒有類構造函數足夠早。

我的結論是,作爲安裝程序項目,您不能通過代碼停止服務,在對話框之前。

由於沒有其他方法可以在項目中執行代碼,我沒有看到任何方法來實現這一點。

我真的很希望它有所不同,因爲我自己非常需要這個,但是安裝程序項目中沒有任何「掛鉤」,它可以及早進入以解決問題。


我最好的建議是做兩個安裝程序。

其中一個充當第二個包裝器,在安裝時正常啓動第二個安裝器。

但是在卸載時,它先停止服務,然後卸載第二個。

但是這對我來說太過分了,所以我還沒有進一步探索這個。