用VS(c#)创建、调试windows service以及部署卸载
同事問到windows service的東東,現(xiàn)在整理一下,用c#如何創(chuàng)建一個windows service,以及如何調(diào)試、部署、卸載。
一、創(chuàng)建windows service
1. 打開VS2008,新建一個Project, Project類型選擇Visual C#-Windows,在Templates中選擇Windows Service, 其他可以默認(rèn),點(diǎn)擊OK。
2. 在Solution Explorer中會看到自動產(chǎn)生了三個文件:app.config, Program.cs,Service1.cs,其中app.config可以添加一些自定義的配置信息,供代碼文件使用;Program.cs提供了Main()方法,作為程序的人口,一般不需要修改;Service1.cs就是要實現(xiàn)的服務(wù)。
3. 雙擊打開Service1.cs,會默認(rèn)打開Service1.cs[Design],在這個界面可以拖拽一個組件,此外,在Properties中,會看到一些關(guān)于這個service的屬性設(shè)置,比如AutoLog(True:使用windows event log記錄該service的日志;False:用戶可以自定義自己的event Log),CanPauseAndContinue(True:可以處理暫停和繼續(xù)該服務(wù)的操作;False:不可以處理暫停或者繼續(xù)該服務(wù)的操作),ServiceName(用于讓Service Control Manager識別的服務(wù)名稱)。
4. 轉(zhuǎn)到Code視圖,可以看到默認(rèn)生成了一個構(gòu)造函數(shù),和兩個需要重寫的方法OnStart和OnStop,我們需要覆寫這兩個方法。下面是簡單重寫了OnStart方法。
protected override void OnStart(string[] args) { ??????????? string path = @"d:\share\test.txt"; ??????????? StreamWriter sw; ??????????? sw = new StreamWriter(path); ??????????? foreach (string arg in args) sw.WriteLine(arg); ??????????? sw.Close(); ??????????? sw.Dispose(); } 這樣最基本的一個windows service就搞定了,但是能否正常運(yùn)行,我們需要調(diào)試一把。
二、調(diào)試windows service
通常,我們用的調(diào)試方法是需要把服務(wù)部署好,然后attach to process...,找到對應(yīng)的服務(wù)進(jìn)程,予以調(diào)試。但是操作比較繁瑣,修改完服務(wù)后,需要卸載服務(wù),然后重新部署,并且OnStart方法難以調(diào)試。從網(wǎng)絡(luò)上找到一個好的調(diào)試方法,并嘗試通過,很好用的,推薦給大家:)
1. 在Service1.cs中添加public方法,將需要調(diào)試的protected方法進(jìn)行封裝,供Main()調(diào)用,以調(diào)試OnStart()為例:
public void start(string[] args) { ??????????? this.OnStart(args); }
2. 在Main()中添加下面的代碼,在人機(jī)交互時執(zhí)行:
if (Environment.UserInteractive) ??????????? { ??????????????? Service1 s = new Service1(); ??????????????? string[] args = { "a", "b" }; ??????????????? s.start(args); ??????????????? Console.WriteLine("the service is started"); ??????????????? Console.ReadLine(); ??????????????? s.stop(); ??????????????? Console.WriteLine("the service is stopped"); ??????????? } ??????????? else ??????????? { ??????????????? ServiceBase[] ServicesToRun; ??????????????? ServicesToRun = new ServiceBase[] ?????? { ??????? new Service1() ?????? }; ??????????????? ServiceBase.Run(ServicesToRun); ??????????? }
3. 更改Project的輸出類型
右擊該P(yáng)roject,點(diǎn)擊Properties,在Application標(biāo)簽中,更改Output Type為Console Application。
好了,這樣就可以按F5調(diào)試了:)
三、部署
1. 在Service1.cs的design視圖中,右擊鼠標(biāo),點(diǎn)擊Add Installer,會自動創(chuàng)建一個ProjectInstall.cs文件,在design視圖中,有兩個組件serviceProcessInstaller1:這個組件的屬性有一個叫Accout,默認(rèn)是User,這樣在部署的時候需要輸入用戶名和密碼,這里我們可以選擇權(quán)限最小的Localservice,當(dāng)然要獲得更多的權(quán)限可以設(shè)置其它兩個network service和local
serviceInstaller1:與服務(wù)本身相關(guān)的信息,比如服務(wù)名,服務(wù)描述,顯示名稱,啟動類型等。
2. 如果使用系統(tǒng)默認(rèn)的event log,那么現(xiàn)在就可以編譯然后部署了;如果使用了自定義的event log,則需要在ProjectInstaller中修改部分代碼。
3. 使用installutil.exe部署windows service
(注意權(quán)限,這里需要用Administrator用戶去部署,否則會提示一些錯誤信息:比如An exception occurred during the Install phase. System.Security.SecurityException: The source was not found, but some or all eve nt logs could not be searched.? Inaccessible logs: Security. 或者 access is denied)
runas /user:Administrator cmd
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
installutil D:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe
到此就部署完成了。
四、卸載服務(wù)
installutil /u D:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe
五、啟動服務(wù)
1. 在啟動服務(wù)時,有時候會出現(xiàn)服務(wù)啟動后又停止的錯誤提示信息,指出該服務(wù)可能沒有被使用,我們可以查看eventvwr,里面會給出足夠的錯誤信息,根據(jù)錯誤信息調(diào)整service代碼就可以了,也有可能是因為服務(wù)要操作文件,沒有權(quán)限的原因,這時候把要操作的文件權(quán)限放開就可以了。
2. 啟動服務(wù)的時候,由于權(quán)限問題啟動失敗,我們可以設(shè)置啟動的賬號。
3. windows service的參數(shù)是在啟動時一次傳遞的,可以以界面形式傳入?yún)?shù),也可以通過命令行的形式:sc start service1 arg0 arg1 ...
轉(zhuǎn)載于:https://www.cnblogs.com/stanley107/archive/2013/02/22/2922571.html
總結(jié)
以上是生活随笔為你收集整理的用VS(c#)创建、调试windows service以及部署卸载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: slider(滑动条)控件模版,样式--
- 下一篇: java io在文件结尾持续添加内容