C#通過創(chuàng)建Windows服務(wù)啟動(dòng)程序的方法詳解
本文實(shí)例講述了C#通過創(chuàng)建Windows服務(wù)啟動(dòng)程序的方法。分享給大家供大家參考,具體如下:
1. 新建一個(gè)Windows服務(wù)應(yīng)用程序
創(chuàng)建項(xiàng)目——》Visual C# 左側(cè)的"+"——》Windows ——》Windows 服務(wù)(右側(cè)模板)——》輸入名稱,確定創(chuàng)建項(xiàng)目
2. 設(shè)置Windows服務(wù)的屬性(Windows服務(wù)里沒有窗體,所以點(diǎn)擊左側(cè)設(shè)計(jì)器里空白的地方即可在右側(cè)屬性欄里看到屬性)
這里屬性是控制服務(wù)器是否可以停止,暫停,繼續(xù)等等的操作。根據(jù)需要選擇。屬性的名字已經(jīng)很明白了,不需要再做太多解釋。我是把 CanPauseAndContinue 和 CanShutDown 設(shè)置為 true。
ServiceName 屬性是這個(gè)服務(wù)的以后再服務(wù)管理器中顯示的名稱。
3. 設(shè)置Windows服務(wù)的安裝程序
在設(shè)計(jì)窗口里右鍵單擊鼠標(biāo),選擇“添加安裝程序”。這樣就可以添加 ProjectInstaller.cs 以及serviceInstaller1 和 serviceProcessInstaller1 這兩個(gè)對(duì)象都有一個(gè)比較重要的屬性。
單擊 serviceInstaller1 在右側(cè)的屬性窗口里有 StartType 屬性,指定的是啟動(dòng)服務(wù)的方式和時(shí)間。如果想讓服務(wù)開機(jī)啟動(dòng),并一直運(yùn)行,將這個(gè)屬性設(shè)置為 Automatic。
單擊 serviceProcessInstaller1 在右側(cè)的屬性窗口里有 Account 屬性,指定的是運(yùn)行此服務(wù)的帳戶類型。如果想讓所有用戶都使用這個(gè)服務(wù),將這個(gè)屬性設(shè)置為 LocalService
目前所有的創(chuàng)建及屬性設(shè)置工作就結(jié)束了。下面開始進(jìn)行代碼編寫工作。
4. 需要用計(jì)時(shí)器來定時(shí)檢測程序是否運(yùn)行,因此我們要增加一個(gè)Timer控件。
打開代碼窗口。
首先,增加 using System.Timers; 引用。
這里有OnStart(string[] args)和OnStop()兩個(gè)函數(shù)。顧名思義,OnStart 就是服務(wù)啟動(dòng)時(shí)運(yùn)行的代碼。OnStop就是服務(wù)結(jié)束時(shí)運(yùn)行的代碼。
我們?cè)贠nStart里創(chuàng)建Timer控件,并設(shè)置其屬性和增加事件。
System.Timers.Timer t = new System.Timers.Timer(1000); //這里的1000指的是Timer的時(shí)間間隔為1000毫秒 t.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Click); //Timer_Click是到達(dá)時(shí)間的時(shí)候執(zhí)行事件的函數(shù) t.AutoReset = true; //設(shè)置是執(zhí)行一次(false)還是一直執(zhí)行(true) t.Enabled = true; //是否執(zhí)行System.Timers.Timer.Elapsed事件
這樣,當(dāng)服務(wù)運(yùn)行后,每1秒都將執(zhí)行 Timer_Click 函數(shù)
5. 編寫 Timer_Click 函數(shù)
private void Timer_Click(Object sender, ElapsedEventArgs e) { Process[] localByName = Process.GetProcessesByName("exe"); if (!IsExistProcess("exe")) //如果得到的進(jìn)程數(shù)是0, 那么說明程序未啟動(dòng),需要啟動(dòng)程序 { Process.Start("exe"); //啟動(dòng)程序的路徑 } else { //如果程序已經(jīng)啟動(dòng),則執(zhí)行這一部分代碼 } } private bool IsExistProcess(string processName) { Process[] MyProcesses = Process.GetProcesses(); foreach (Process MyProcess in MyProcesses) { if (MyProcess.ProcessName.CompareTo(processName) == 0) { return true; } } return false; }
現(xiàn)在所有代碼的工作也完成了。
6. 生成Windows服務(wù)的應(yīng)用程序
單擊 生成 ——》生成 WindowsService1
這時(shí),在 D:\Soft\WindowsService1\bin\Debug 文件夾里會(huì)生成 WindowsService1.exe 文件。
如果成功即可執(zhí)行下一步。
7. 安裝服務(wù)
serviceInstaller1屬性中設(shè)置:
Description(系統(tǒng)服務(wù)的描述)
DisplayName (系統(tǒng)服務(wù)中顯示的名稱)
ServiceName(系統(tǒng)事件查看器里的應(yīng)用程序事件中來源名稱)
serviceProcessInstaller1屬性設(shè)置:Account 下拉設(shè)置成 LocalSystem
服務(wù)與應(yīng)用程序不一樣,不能夠通過在Visual Studio里運(yùn)行,必須使用安裝軟件安裝到Windows 服務(wù)里去。完成上面三個(gè)截圖的操作后,繼續(xù)下面注冊(cè)和卸載操作。
這個(gè)安裝軟件在 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 這個(gè)文件夾里
程序名稱為 InstallUtil.exe
要運(yùn)行這個(gè)程序需要使用 command "命令提示符" 程序。
單擊開始——》運(yùn)行——》輸入"cmd”單擊確定
輸入cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 回車 進(jìn)入這個(gè)文件夾
輸入InstallUtil D:\Soft\WindowsService1\bin\Debug\WindowsService1.exe 即InstallUtil + 服務(wù).exe文件的地址 回車。這時(shí)服務(wù)就安裝完畢了。
如果想卸載這個(gè)服務(wù)也是用這個(gè)軟件。
輸入InstallUtil D:\Soft\WindowsService1\bin\Debug\WindowsService1.exe -u 即"InstallUtil + 服務(wù).exe文件的地址 - u" 回車。這時(shí)服務(wù)就卸載完畢了。
當(dāng)然我們現(xiàn)在不需要卸載這個(gè)服務(wù)。現(xiàn)在只差最后一步實(shí)現(xiàn)我們的功能了。
8. 啟動(dòng)服務(wù)
服務(wù)安裝成功以后,并沒有啟動(dòng),我們需要在服務(wù)管理器中啟動(dòng)它,并且如果運(yùn)行的程序是帶窗體的程序,還需要修改一下服務(wù)的屬性。
進(jìn)入控制面板——》管理工具——》服務(wù) 打開服務(wù)管理器?;蛘哌\(yùn)行-------->cmd------->services.msc---本地服務(wù)設(shè)置
在右側(cè)的服務(wù)列表中找到我們剛才安裝的服務(wù),服務(wù)名稱就是第2步中ServiceName屬性的內(nèi)容。這里就是WindowsService1。
如果運(yùn)行的程序是帶窗體的程序,那么右鍵單擊這個(gè)服務(wù)選擇“屬性”——》單擊“登錄”標(biāo)簽(在最上面)——》選擇本地系統(tǒng)帳戶——》在“允許服務(wù)與桌面交互”復(fù)選框前打勾——》單擊確定退出屬性。
這是,帶有窗體的程序才會(huì)正常運(yùn)行。否則只會(huì)在進(jìn)程中看到該程序,但是沒有窗體。
現(xiàn)在可以單擊這個(gè)服務(wù),然后單擊啟動(dòng)來啟動(dòng)這個(gè)服務(wù)了。
全部過程結(jié)束。
你也可以為服務(wù)創(chuàng)建安裝!
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#遍歷算法與技巧總結(jié)》、《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》、《C#操作Excel技巧總結(jié)》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
上一篇:C#簡單查詢SQLite數(shù)據(jù)庫是否存在數(shù)據(jù)的方法
欄 目:C#教程
下一篇:C#中的委托使用
本文標(biāo)題:C#通過創(chuàng)建Windows服務(wù)啟動(dòng)程序的方法詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6386.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法
- 01-10C#實(shí)現(xiàn)自定義windows系統(tǒng)日志的方法
- 01-10C#通過Semaphore類控制線程隊(duì)列的方法
- 01-10C#3.0使用EventLog類寫Windows事件日志的方法
- 01-10C#動(dòng)態(tài)創(chuàng)建button的方法
- 01-10C#使用windows服務(wù)開啟應(yīng)用程序的方法
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10winform創(chuàng)建不規(guī)則窗體的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?