C#制作 Windows 服務安裝程序


         最近項目中需要使用一些Win服務來處理一些類似於數據同步的業務,對於服務需要執行的業務倒是很容易的按部就班的寫完了,在服務的安裝部署問題上卻費了一番功夫折騰.今天就借此機會在此略微總結下,一方面為后面遇到同樣困惑的同學指下路,同時也為了給自己日后提個醒.

        我們先來看一下我們熟悉思維中服務是如何安裝的,"installutil 服務路徑",沒錯,我們一般談到服務安裝可能最容易想起的就是這個命令了, 但是當項目越來越大之后, 去安裝部署服務的兄弟們也許就不是我們開發人員了, 甚至可能是對.Net 框架完全不熟悉的人,那我們要求對方必選得掌握這個命令就有點讓人....

      那么有沒有更好的方法呢? 在這個問題上我們走了很多彎路,為了不讓大家誤入歧途,就直接把正確的步驟放在此吧. 當然這個解決方案也參考了很多前輩高人的意見.

  1.  創建一個Windows安裝部署項目,詳情略

  2. 在部署項目中選擇切換到"文件系統"視圖,添加對應的項目輸出(如果需要打包多個服務,將每個服務項目的主輸出一並添加即可),詳情略

  3. 在"文件系統"視圖繼續中添加 Installutil.exe 這個文件(通常路徑在C:\Windows\Microsoft.NET\Framework\v4.0.30319,當然根據你自己的實際選擇不同的版本),如下截圖

     image

  4.切換到"自定義操作"視圖中,對"安裝/提交/回滾/卸載"步驟中,依次添加 Installutil.exe 及項目主輸出信息.同時需要注意 Installutil.exe 文件應該放在每個步驟中的第一個文件位置,如下截圖

      image

   5. 網上有的同學說,還需要設置每個Installutil.exe 的參數,及需要在Installutil.exe 的屬性窗口中指定參數,如下截圖所示,參數值為當前需要"安裝的服務文件名".可以寫多個用空格隔開. (卸載參數值為 "–u 服務文件名")

       image

按照以上步驟確實能安裝成功,不過后面我在省略了第五步后,安裝也同樣成功了,貌似第五步不是必須的.

 

在此,我們的服務安裝部署就打包完成了.就可以像安裝其他普通程序一般一路下一步即可

imageimageimage

我們計算機服務列表中也順利找到了我們的服務,表明確實安裝成功了.

image

但從上圖我們可以看出,還有一點小小問題,我們的服務安裝后默認並沒有啟動,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,至此,我們所希望的全部功能都已實現,大功告成.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM