1. 基本流程
一個Windows服務程序是在Windows操作系統下能完成特定功能的可執行的應用程序。Windows服務程序雖然是可執行的,但是它不像一般的可執行文件通過雙擊就能開始運行了,它必須有特定的啟動方式。這些啟動方式包括了自動啟動和手動啟動兩種。對於自動啟動的Windows服務程序,它們在Windows啟動或是重啟之后用戶登錄之前就開始執行了。只要你將相應的Windows服務程序注冊到服務控制管理器(Service Control Manager)中,並將其啟動類別設為自動啟動就行了。而對於手動啟動的Windows服務程序,你可以通過命令行工具的NET START 命令來啟動它,或是通過控制面板中管理工具下的服務一項來啟動相應的Windows服務程序。
同樣,一個Windows服務程序也不能像一般的應用程序那樣被終止。因為Windows服務程序一般是沒有用戶界面的,所以你也要通過命令行工具或是下面圖中的工具來停止它,或是在系統關閉時使得Windows服務程序自動停止。因為Windows服務程序沒有用戶界面,所以基於用戶界面的API函數對其是沒有多大的意義。為了能使一個Windows服務程序能夠正常並有效的在系統環境下工作,程序員必須實現一系列的方法來完成其服務功能。Windows服務程序的應用范圍很廣,典型的Windows服務程序包含了硬件控制、應用程序監視、系統級應用、診斷、報告、Web和文件系統服務等功能。
和Windows服務程序相關的命名空間涉及到以下兩個:System.ServiceProcess 和System.Diagnostics。
1.1 創建Windows Service項目
從Visual C# 工程中選取 Windows 服務(Windows Service)選項,給工程一個新文件名,然后點擊 確定。
1.2 向服務中函數功能實現
OnStart函數在啟動服務時執行,OnStop函數在停止服務時執行。在這里,當啟動和停止服務時,向一個文本文件中寫入一些文字信息
1.3 回到設計窗口點右鍵選擇-添加安裝程序 -生成serviceInstaller1和 serviceProcessInstaller1兩個組件
把serviceInstaller1的屬性ServiceName改寫為你的服務程序名,並把啟動模 式設置為AUTOMATIC
把serviceProcessInstaller1的屬性account改寫為 LocalSystem
1.4 編譯鏈接生成服務程序
通過從生成菜單中選擇生成來生成項目。
1.5 安裝服務
用.net framework工具INSTALLUTIL安裝服務程序即可。
用項目的輸出作為參數,從命令行運行 InstallUtil.exe。在命令行中輸入下列代碼:
installutil yourproject.exe
Hint: a windows service must first be installed using installutil.exe and then started with the serviceExplorer, windows Services Administrative tool or the NET START command.
1.6 卸載服務
用項目的輸出作為參數,從命令行運行 InstallUtil.exe。
installutil /u yourproject.exe
3. Windows服務安裝異常
System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。不可 訪問的日志: Security
右鍵單擊“以管理員身份運行”Visual Studio Command Prompt即可
4. Windows服務執行異常
錯誤:本地計算機上的XXX服務啟動后又停止了
打開控制面板/管理工具/事件查看器 ->應用程序
雙擊錯誤信息,即可找到服務的錯誤提示。
5. 安裝程序工具 (Installutil.exe)
安裝程序工具使您得以通過在執行指定程序集中的安裝程序組件來安裝和卸載服務器資源。此工具與 System.Configuration.Install 命名空間中的類一起工作。
安轉的位置和路徑在:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
卸載的位置和路徑在:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
安裝程序工具 (Installutil.exe) 安裝方法和參數:
安裝程序工具 (Installutil.exe) 安裝方法和參數:
installutil [/uninstall][option [...]]assemblyname ][option [...]]assemblyname
/h[elp]
顯示該工具的命令語法和選項。
/help assemblypath
顯示指定程序集中的個別安裝程序所識別的任何附加選項。
/?
顯示該工具的命令語法和選項。
/? assemblypath
顯示指定程序集中的個別安裝程序所識別的任何附加選項。
/LogFile=[filename]
指定在其中記錄安裝進度的日志文件的名稱。默認文件名是 assemblyname.InstallLog。
/AssemblyName assemblyName
[,Version=major.minor.build.revision]
[,Culture=locale]
[,PublicKeyToken=publicKeyToken]]
指定程序集的名稱。必須使用程序集的版本、區域性和公鑰標記完全限定程序集名稱。完全限定名必須用引號括起。
例如,“myAssembly, Culture=neutral, PublicKeyToken=0038abc9deabfle5, Version=2.0.0.0”是完全限定的程序集名稱。
/LogToConsole={true|false}
如果為 true,則將輸出顯示到控制台。如果為 false(默認值),則取消將輸出顯示到控制台。
/ShowCallStack
如果在安裝過程中的任何時候出現異常,則將調用堆棧打印到日志。
備註
可以在同一個命令行上指定多個程序集。出現在程序集名稱前面的任何選項應用於該程序集的安裝。為某個程序集指定的選項應用於後面的任何程序集,除非該選項與新程序集名稱一起指定。
Microsoft .NET Framework 應用程序由傳統的程序文件和關聯資源組成,如必須在部署應用程序時創建的消息隊列、事件日誌和性能計數器。安裝應用程序時可以使用程序集的安裝程序組件創建這些資源,而在卸載應用程序時可以使用這些組件刪除這些資源。Installutil.exe 檢測並執行這些安裝程序組件。
如果對某個程序集運行 Installutil.exe 但不指定任何選項,則 Installutil.exe 將下面三個文件放到該程序集的目錄中:
InstallUtil.InstallLog
包含安裝進度的常規說明。
assemblyname.InstallLog
包含安裝過程的提交階段特定的信息。有關提交階段的更多信息,請參見 Installer.Commit 方法。
assemblyname.InstallState
包含用於卸載該程序集的數據。
Installutil.exe 使用反射檢查指定的程序集並查找將 RunInstallerAttribute 設置為 true 的所有 Installer 類型。然後此工具在 Installer 類型的每個實例上執行 Install 方法或 Uninstall 方法。Installutil.exe 以事務性方式執行安裝;如果有一個程序集未能安裝,則 Installutil.exe 回滾其他所有程序集的安裝。卸載不是事務性的。
請註意,不能使用 Installutil.exe 來部署用 C++ 的托管擴展創建的 Windows 服務。Installutil.exe 無法識別由 C++ 編譯器產生的嵌入的本機代碼。如果試圖使用 Installutil.exe 來部署托管擴展 Windows 服務,則會引發異常(如 BadImageFormatException)。要處理這種情況,請將服務代碼移動到 C++ 的托管擴展模塊。然後,用 C# 或 Visual Basic 來編寫安裝程序對象。
示例
下列命令顯示命令語法和選項的說明。
installutil
下面的命令執行 myAssembly.exe 程序集中的安裝程序組件。
installutil myAssembly.exe
下面的命令執行 myAssembly.exe 程序集中的卸載程序組件。
installutil /u myAssembly.exe
下面的命令執行 myAssembly.exe 程序集中的安裝程序並指定將進度信息寫入 myLog.InstallLog 中。
installutil /LogFile=myLog.InstallLog myAssembly.exe
下面的命令將 myAssembly.exe 的安裝進度寫入 myLog.InstallLog 中,並將 myTestAssembly.exe 的進度寫入 myTestLog.InstallLog 中。
installutil /LogFile=myLog.InstallLog myAssembly.exe /LogFile = myTestLog.InstallLog myTestAssembly.
6. 通過部署工具安裝
通過構建安裝包實現安裝,如果需要在安裝后自動啟動,則需要在ProjectInstaller中重載Commit方法
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
ServiceController sc = new ServiceController("CiLisInterface");
if(sc .Status.Equals(ServiceControllerStatus.Stopped))
{
sc.Start();
}
}
生成安裝包后可以通過程序的唯一識別編號進行卸載,卸載方法為:
string sysroot = System.Enviorment.SystemDirectory;
Process Uninstall = new Process();
Uninstall.FileName= sysroot +"//msiexec.exe";
Uninstall.StartInfo.Arguments = "/x{程序的唯一識別} /qb";
Uninstall.Start();

7. 通過命令行快速部署
一、直接使用cmd來進行服務的一些操作
1、安裝服務
sc create test3 binPath= "C:\Users\Administrator\Desktop\win32srvDemo\win32srvdemo\Debug\win32srvDemo.exe"
其中:test3為創建的服務名,binPath后面是運行exe文件的所在路徑
2、配置服務
有以下集中方式:
sc config 服務名 start=AUTO (自動)
sc config 服務名 start= DEMAND (手動)
sc config 服務名 start= DISABLED(禁用)
例如下面的命令,在XP系統中開機便會自動啟動:
sc config test3 start= AUTO
3、開啟服務
net start test3
4、關閉服務
net stop test3
5、刪除服務
sc delete test3
二、為方便使用,可編輯為bat批處理文件
(新建一個txt文件,自己命名,把后綴改為.bat文件)
1、創建、配置、開啟服務
@echo.服務啟動......
@echo off
@sc create test3 binPath= "C:\Users\Administrator\Desktop\win32srvdemo\win32srvdemo\Debug\win32srvdemo.exe"
@net start test3
@sc config test3 start= AUTO
@echo off
@echo.啟動完畢!
@pause
2、關閉服務
@echo.服務關閉
@echo off
@net stop test3
@echo off
@echo.關閉結束!
@pause
3、刪除服務
@echo.服務刪除
@echo off
@sc delete test3
@echo off
@echo.刪除結束!
@pause