可能是太過於懶惰的原因,研究個windows 服務的安裝程序都花了大半天時間。在網上看了一些示例,大部分都言過其實,把過程搞得太過復雜,老是需要去研究如何利用InstallUtil.exe及其參數。事實上,既然要安裝.net下制作的windows服務,肯定首先得在目標機器上安裝有.net框架。因此,InstallUtil.exe也一定已經存在目標機器上了,因而利用微軟的傻瓜式操作就能很好地解決windows服務安裝和卸載的問題。
過一段時間估計還要狠狠地利用windows服務來完成一些功能,為了加深印象,又回過頭弄了一個名叫HelloWorldService的windows服務,用最簡單的demo來完成所有的操作。這個服務的功能,僅僅是在它啟動的時候創建一個HelloWorld.txt文件,里邊寫上Hello World!這幾個簡單的字母而已。
1、選擇Visual C#->Windows->Windows 服務,創建一個HelloWorldService項目。
2、通過ServiceName更改服務的名稱為”HelloWorldService“,這是最后在安裝服務成功后在服務管理面板出現的名稱。
3、將Service1.cs更名為HelloWorldService.cs,在其OnStart方法中寫入簡單的代碼,用來實現創建文件並寫入“Hello World!"這幾個經典字母。
4、在HelloWorldService.cs的設計界面點右鍵,在彈出菜單中選擇”添加安裝程序“。
點擊后出來的設計界面上添加了兩個控件——ServiceProcessInstall和ServiceInstaller。


LocalSystem 服務控制管理員使用的帳戶,它具有本地計算機上的許多權限並作為網絡上的計算機。
NetworkService 提供廣泛的本地特權的帳戶,該帳戶將計算機的憑據提供給所有遠程服務器。
User 由網絡上特定的用戶定義的帳戶。如果為 ServiceProcessInstaller.Account 成員指定 User,則會使系統在安裝服務時提示輸入有效的用戶名和密碼,除非您為 ServiceProcessInstaller 實例的 Username 和 Password 這兩個屬性設置值。
ServiceInstaller安裝一個類,該類擴展 ServiceBase 來實現服務。在安裝服務應用程序時由安裝實用工具調用該類。在這里主要修改其StartType屬性。此值指定了服務的啟動模式。

Disabled 指示禁用該服務,以便它無法由用戶或應用程序啟動。
Manual 指示服務只由用戶(使用“服務控制管理器”)或應用程序手動啟動。
5、上面這些都是安裝包最終要安裝/卸載的對象。下面就來看看如何用.net制作安裝包。
需要在解決方案里邊添加一個安裝項目,取其名稱為HelloWorldSetup。




在彈出的窗口中雙擊”應用程序文件夾“。
然后選擇”主輸出來自HelloWorldService(活動)“,點擊”確定“。
選擇之后會發現所有的操作下邊都添加了剛才選定的項。做到這一步,就能使安裝程序卸載時不僅把程序卸載下來,也能把服務卸載下來。
9、接下來在安裝項目上點右鍵,選擇”生成“,就能使安裝程序正常發布了,成功后會生成兩個文件。
把這兩個文件拷到目標機器上,雙擊HelloWorldSetup.msi文件,就可以開始安裝服務的征途了。


不過不用急,這種錯誤可以在系統的”事件查看器“中的”應用程序“選項中查看具體的錯誤信息。
呵呵,原來是由於服務對於文件系統的操作權限問題所引起的。跑回去一看,發現在第5步中對ServiceProcessInstaller的Account設置成了LocalService,於是乎改成了LocalSystem。然后重新發布安裝程序,再重新安裝服務,再啟動,呵呵,一切正常!
10、最后,一起來欣賞這個windows 服務的成果:
參考:https://blog.csdn.net/wangzhen209/article/details/52931463