最近項目中需要使用一些Win服務來處理一些類似於數據同步的業務,對於服務需要執行的業務倒是很容易的按部就班的寫完了,在服務的安裝部署問題上卻費了一番功夫折騰.今天就借此機會在此略微總結下,一方面為后面遇到同樣困惑的同學指下路,同時也為了給自己日后提個醒.
我們先來看一下我們熟悉思維中服務是如何安裝的,"installutil 服務路徑",沒錯,我們一般談到服務安裝可能最容易想起的就是這個命令了, 但是當項目越來越大之后, 去安裝部署服務的兄弟們也許就不是我們開發人員了, 甚至可能是對.Net 框架完全不熟悉的人,那我們要求對方必選得掌握這個命令就有點讓人....
那么有沒有更好的方法呢? 在這個問題上我們走了很多彎路,為了不讓大家誤入歧途,就直接把正確的步驟放在此吧. 當然這個解決方案也參考了很多前輩高人的意見.
1. 創建一個Windows安裝部署項目,詳情略
2. 在部署項目中選擇切換到"文件系統"視圖,添加對應的項目輸出(如果需要打包多個服務,將每個服務項目的主輸出一並添加即可),詳情略
3. 在"文件系統"視圖繼續中添加 Installutil.exe 這個文件(通常路徑在C:\Windows\Microsoft.NET\Framework\v4.0.30319,當然根據你自己的實際選擇不同的版本),如下截圖
4.切換到"自定義操作"視圖中,對"安裝/提交/回滾/卸載"步驟中,依次添加 Installutil.exe 及項目主輸出信息.同時需要注意 Installutil.exe 文件應該放在每個步驟中的第一個文件位置,如下截圖
5. 網上有的同學說,還需要設置每個Installutil.exe 的參數,及需要在Installutil.exe 的屬性窗口中指定參數,如下截圖所示,參數值為當前需要"安裝的服務文件名".可以寫多個用空格隔開. (卸載參數值為 "–u 服務文件名")
按照以上步驟確實能安裝成功,不過后面我在省略了第五步后,安裝也同樣成功了,貌似第五步不是必須的.
在此,我們的服務安裝部署就打包完成了.就可以像安裝其他普通程序一般一路下一步即可
我們計算機服務列表中也順利找到了我們的服務,表明確實安裝成功了.
但從上圖我們可以看出,還有一點小小問題,我們的服務安裝后默認並沒有啟動,OK,我們再來改一下我們的服務,添加一個安裝結束事件,大致代碼如下所示
/// <summary> /// ProjectInstaller /// </summary> public ProjectInstaller() { InitializeComponent(); this.AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall); } /// <summary> /// 服務程序安裝結束執行 /// </summary> /// <param name="sender">事件源</param> /// <param name="e">事件參數</param> private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) { //服務安裝結束 自動啟動 try { //設置服務與桌面交互 否則不能調用有界面的程序 ManagementObject wmiService = new ManagementObject(string.Format("Win32_Service.Name='{0}'", ConstValues.SYNC_SERVICE_NAME)); ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change"); changeMethod["DesktopInteract"] = true; ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", changeMethod, null); //啟動服務 ServiceController sc = new ServiceController(ConstValues.SYNC_SERVICE_NAME); if (sc.Status.Equals(ServiceControllerStatus.Stopped)) { sc.Start(); } } catch { } }
OK,至此,我們所希望的全部功能都已實現,大功告成.