国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用VisualStudio2015Community開發(fā)windows服務(wù)

2019-11-14 13:32:03
字體:
供稿:網(wǎng)友

  昨天研究在.NET下開發(fā)Windows服務(wù)程序,期間遇到一些小問題,這里僅將自己的開發(fā)過程和需要注意的地方寫下和廣大網(wǎng)友分享……

   1、基礎(chǔ)

    Windows服務(wù)是指系統(tǒng)啟動(dòng)時(shí)能夠自己運(yùn)行的程序。Windows服務(wù)可以在沒有交互界面的情況下在后臺(tái)進(jìn)行業(yè)務(wù)的處理。

  .NET下開發(fā)Windows服務(wù)需要幾個(gè)基本的類,它們?cè)诔绦蚣疭ystem.ServicePRocess.dll和System.Configuration.Install.dll中,分別是:ServiceBase、ServiceInstaller、ServiceProcessInstaller、Installer,這幾個(gè)類是開發(fā)一個(gè)最簡(jiǎn)單的Windows服務(wù)所必須的。

  2、使用Visual Studio 2015 Commnuity創(chuàng)建Windows服務(wù)項(xiàng)目

    

  在Classic Desktop(經(jīng)典桌面程序)中選擇Windows Service項(xiàng)目。項(xiàng)目文件結(jié)構(gòu)如下:

  

  雙擊Service1.cs進(jìn)入服務(wù)設(shè)計(jì)界面,設(shè)置ServiceName屬性(該屬性在下文中還會(huì)提及,請(qǐng)留意),該屬性是系統(tǒng)控制Windows服務(wù)的標(biāo)識(shí):

  

  這里我將ServiceName屬性設(shè)置為Test,大家注意看屬性面板的上邊,發(fā)現(xiàn)這里設(shè)置的是ServiceBase類的屬性。ServiceBase類是.NET中創(chuàng)建所有Windows服務(wù)的基類。在創(chuàng)建新的服務(wù)類時(shí),必須從 ServiceBase 派生。

  接下來我們看下Service1.cs文件的代碼部分,可以看到里面有個(gè)Service1類繼承自ServiceBase類,還有兩個(gè)重寫方法,OnStart和OnStop。OnStart中的代碼將會(huì)在服務(wù)啟動(dòng)之后運(yùn)行,OnStop中的代碼在服務(wù)停止時(shí)運(yùn)行。除此之外還有OnPause、OnContinue等方法。這是我們編譯項(xiàng)目會(huì)在bin/Dubug文件夾下生成WindowsService1.exe文件,這個(gè)文件就是我們創(chuàng)建的Windows服務(wù)。是不是感覺很簡(jiǎn)單?但是如果你以為Windows服務(wù)的創(chuàng)建工作到此為止就結(jié)束了,那就錯(cuò)了。不信雙擊WindowsService1.exe運(yùn)行試試……

3、Windows服務(wù)的安裝

  看到了吧,提示我們想要運(yùn)行Windows服務(wù)要先安裝該服務(wù)

  

  提示信息中提到了installutil.exe,這里先不說它的用處。我們要想安裝剛剛創(chuàng)建的Windows服務(wù),首先要在項(xiàng)目中創(chuàng)建安裝文件,如圖:

  

  雙擊剛剛創(chuàng)建的Installer1.cs文件會(huì)進(jìn)入它的設(shè)計(jì)界面,這里且不管設(shè)計(jì)界面,我們直接進(jìn)入代碼界面,會(huì)看到里面有一個(gè)類:Installer1,它繼承自

System.Configuration.Install命名空間下的Installer類,Installer 類是 .NET中所有自定義安裝程序的基類。

  首先我們?cè)贗nstaller1的構(gòu)造函數(shù)中定義我們的服務(wù)進(jìn)程安裝類(即上文提到的ServiceProcessInstaller)實(shí)例和服務(wù)安裝類(即上文提到的ServiceInstaller)實(shí)例

        public Installer1()        {            InitializeComponent();            ServiceProcessInstaller spi = new ServiceProcessInstaller();            spi.Account = ServiceAccount.LocalSystem;//設(shè)置服務(wù)要運(yùn)行在什么類型的賬號(hào)下            //這里可以創(chuàng)建多個(gè)ServiceInstaller實(shí)例            ServiceInstaller si = new ServiceInstaller();            si.ServiceName = "Test";//系統(tǒng)操作服務(wù)的標(biāo)識(shí),要和ServiceBase中設(shè)置的ServiceName屬性值相同            si.DisplayName = "測(cè)試服務(wù)";//展示給用戶的服務(wù)名,即在控制面板中看到的服務(wù)名            si.Description = "服務(wù)的描述信息";            si.StartType = ServiceStartMode.Manual;//服務(wù)的啟動(dòng)方式,這里設(shè)置為手動(dòng)            //最后記得把創(chuàng)建的實(shí)例添加到安裝列表中            this.Installers.Add(si);            this.Installers.Add(spi);        }
View Code

  到此,對(duì)于安裝服務(wù)的基本信息已經(jīng)填寫完畢。接下來我們還需要重寫基類Installer中的兩個(gè)方法:

        //注意必須重寫Install和Uninstall方法,且在重寫方法中必須調(diào)用基類對(duì)應(yīng)的方法,否則在安裝和卸載服務(wù)的過程中會(huì)出問題        //小編就是因?yàn)闆]有調(diào)用基類中的方法導(dǎo)致安裝和卸載出現(xiàn)問題        //出此之外還有Commit、Rollback等方法        public override void Install(IDictionary stateSaver)        {            base.Install(stateSaver);        }        public override void Uninstall(IDictionary savedState)        {            base.Uninstall(savedState);        }    
View Code

  

  這里大家要注意一點(diǎn),在Installer1類上使用了特性:RunInstaller(true),如果我們將特性的參數(shù)設(shè)為false,那么安裝工具installutil將會(huì)忽略該類,我們?cè)诎惭b服務(wù)時(shí)就不會(huì)安裝該類中指定的服務(wù)。

  完成上述步驟之后,我們?cè)俅尉幾g項(xiàng)目……

  在上文中我們提到了installutil.exe工具,它是用來安裝.NET編寫的Windows服務(wù)的工具,它的路徑是C:/Windows/Microsoft.NET/Framework/v4.0.30319/InstallUtil.exe。其中v4.0.30319是.NET的版本號(hào),使用不同版本的.NET編寫Windows服務(wù)要使用對(duì)應(yīng)的installutil.exe來安裝。

  我們打開命令行或使用VS自帶的命令行工具,這里我們使用VS自帶的命令行工具:Developer Command Prompt for VS2015來進(jìn)行安裝工作。

  打開命令行工具,輸入:installutil.exe Windows服務(wù)程序的路徑(這里小編涂去了和個(gè)人信息相關(guān)的部分)然后回車

  

  如使用系統(tǒng)的命令行工具就需要先跳轉(zhuǎn)到installutil.exe所在的路徑或者在命令行中指明它的路徑。

  回車之后會(huì)發(fā)現(xiàn),Windows服務(wù)開始安裝了,在然后就會(huì)發(fā)現(xiàn)安裝出現(xiàn)了問題……

  

  對(duì)于這個(gè)問題的解決方式相當(dāng)簡(jiǎn)單,就是以管理員身份運(yùn)行命令行工具即可(小編卻花費(fèi)了很長(zhǎng)的時(shí)間才悟出來這個(gè)道理)。

  以管理員身份運(yùn)行命令行,再次執(zhí)行安裝過程,我們可以看到安裝過程分為:安裝和提交兩步。

  安裝完成之后,我們可以在控制面板的服務(wù)管理器中看到剛剛安裝的服務(wù):

  

  安裝完成之后我們來啟動(dòng)服務(wù),這里使用命令行來啟動(dòng),也可以在服務(wù)管理器中啟動(dòng)。

  

  大家注意到?jīng)]有?控制面板服務(wù)管理器中顯示的服務(wù)名稱是DisplayName屬性指定的名稱,而我們啟動(dòng)服務(wù)時(shí)要使用ServiceName屬性指定的服務(wù)名,否則會(huì)提示我們服務(wù)名無效。

  服務(wù)的停止使用命令:net stop 服務(wù)名稱。

  服務(wù)的卸載使用installutil /u 服務(wù)程序路徑來完成。

  至此,在.NET中開發(fā)一個(gè)簡(jiǎn)單的Windows服務(wù)的工作已經(jīng)全部完成……

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 美姑县| 遂昌县| 雅江县| 荥阳市| 吴忠市| 育儿| 鹤壁市| 克什克腾旗| 文成县| 余庆县| 平南县| 衡山县| 城口县| 自贡市| 朔州市| 新安县| 望城县| 西吉县| 乌拉特前旗| 大足县| 且末县| 澄江县| 应用必备| 雷山县| 云梦县| 司法| 井研县| 会昌县| 马鞍山市| 阆中市| 镇赉县| 清徐县| 马边| 新邵县| 郴州市| 太仓市| 东光县| 陆丰市| 五寨县| 肇东市| 台前县|