不得不說,.NET中安裝服務很麻煩,即要創建Service,又要創建ServiceInstall,最后還要弄一堆命令來安裝和卸載。
今天給大家提供一種方式,直接使用我們的程序來安裝/卸載服務,並且可以讓一個exe即能直接運行也行安裝為windows服務
首先我們創建一個Windows應用程序,(我創建的是控制台程序,WinForm也一樣)
接下來在項目中添加一個Windows服務類
然后雙擊“MainService.cs”,在上面點右鍵“打開代碼”
這里面寫服務的具體實現,以下是我寫的示例代碼
partial class MainService : ServiceBase { public MainService() { InitializeComponent(); } protected override void OnStart(string[] args) { // TODO: 在此處添加代碼以啟動服務。 System.IO.File.AppendAllText("D:\\log.txt", "服務已啟動……" + DateTime.Now.ToString()); } protected override void OnStop() { // TODO: 在此處添加代碼以執行停止服務所需的關閉操作。 System.IO.File.AppendAllText("D:\\log.txt", "服務已停止……" + DateTime.Now.ToString()); } }
然后我們改程序入口Main方法,讓其在啟動時識別是Windows應用程序還是Windows服務,如果是應用程序就執行應用程序的代碼,如果是服務就執行MainService的代碼
如果是服務,我給了一個"s"參數,如果有這個參數就證明是Windows服務,然后啟動MainService
static void Main(string[] args) { //如果傳遞了"s"參數就啟動服務 if (args.Length > 0 && args[0] == "s") { //啟動服務的代碼,可以從其它地方拷貝 ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MainService(), }; ServiceBase.Run(ServicesToRun); } else {}
然后,我們再實現應用程序的功能,就是上面的else語句塊,應用程序的功能就是安裝/卸載服務,可以用windows自帶的sc命令來進行安裝和卸載,具體代碼如下:
Console.WriteLine("這是Windows應用程序"); Console.WriteLine("請選擇,[1]安裝服務 [2]卸載服務 [3]退出"); var rs = int.Parse(Console.ReadLine()); switch (rs) { case 1: //取當前可執行文件路徑,加上"s"參數,證明是從windows服務啟動該程序 var path = Process.GetCurrentProcess().MainModule.FileName + " s"; Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服務 start= auto"); Console.WriteLine("安裝成功"); Console.Read(); break; case 2: Process.Start("sc", "delete myserver"); Console.WriteLine("卸載成功"); Console.Read(); break; case 3: break; }
這樣我們就實現了一個即是可執行程序又是Windows服務的應用程序
Main方法完整代碼如下
static void Main(string[] args) { if (args.Length > 0 && args[0] == "s") { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MainService(), }; ServiceBase.Run(ServicesToRun); } else { Console.WriteLine("這是Windows應用程序"); Console.WriteLine("請選擇,[1]安裝服務 [2]卸載服務 [3]退出"); var rs = int.Parse(Console.ReadLine()); switch (rs) { case 1: //取當前可執行文件路徑,加上"s"參數,證明是從windows服務啟動該程序 var path = Process.GetCurrentProcess().MainModule.FileName + " s"; Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服務 start= auto"); Console.WriteLine("安裝成功"); Console.Read(); break; case 2: Process.Start("sc", "delete myserver"); Console.WriteLine("卸載成功"); Console.Read(); break; case 3: break; } } }
至此,程序已基本寫完,接下來我們測試一下
直接雙擊ServiceOrApp.exe
輸入 1
提示安裝成功,然后運行“services.msc"打開服務管理器
可以發現我們的服務已安裝成功,然后右鍵啟動服務
成功啟動
然后去D盤看看log.txt
說明服務執行正常
我們再停止服務
成功停止后再看看D盤的log.txt文件
看到以上內容,說明服務啟動和停止都沒問題(忘了輸出換行符 - -!)
然后我們再試一下卸載服務,還是雙擊ServiceOrApp.exe,選擇2
提示卸載成功,然后再運行“services.msc"打開服務管理器
可以看到已經沒有”我的服務“了,已成功卸載
這里安裝和卸載主要運用了windows的sc命令,然后使用啟動參數來判斷是服務還是程序以執行不同的代碼