演練:在組件設計器中創建 Windows 服務應用程序

http://msdn.microsoft.com/zh-cn/library/zt39148a(v=vs.80).aspx

演練:在組件設計器中創建 Windows 服務應用程序

.NET Framework 2.0
其他版本
5(共 5)對本文的評價是有幫助?-?評價此主題

?

Note注意

Visual Studio 標準版中不提供“Windows 服務”模板及相關功能。有關更多信息,請參見?Visual Studio 版本。

本主題中的步驟引導您完成創建簡單的向事件日志寫入消息的 Windows 服務應用程序的過程。創建和使用服務所執行的基本步驟包括:

  • 使用“Windows 服務”應用程序模板創建項目。此模板為您創建一個從?ServiceBase?繼承的類,并編寫大量基本服務代碼,例如啟動服務的代碼。

  • 編寫?OnStart?和?OnStop?過程的代碼,并重寫要重新定義的任何其他方法。

  • 添加服務應用程序所必需的安裝程序。默認情況下,當單擊“添加安裝程序”鏈接時,一個包含兩個或多個安裝程序的類將被添加到應用程序中:一個用于安裝進程,其他安裝程序中的每一個用于項目包含的每個關聯服務。

  • 生成您的項目。

  • 創建安裝項目以安裝服務,然后進行安裝。

  • 訪問 Windows 2000 服務控制管理器并啟動您的服務。

首先,創建項目并設置服務正常運行所必需的值。

創建服務

創建并配置服務

  1. 在“文件”菜單上單擊“新建項目”。

    打開“新建項目”對話框。

  2. 在 Visual Basic、Visual C#、Visual C++ 或 Visual J# 項目模板的列表中選擇“Windows 服務”項目,并將其命名為?MyNewService。單擊“確定”。

    Note注意

    項目模板自動添加從?System.ServiceProcess.ServiceBase?繼承的名為?Service1?的組件類。

  3. 單擊設計器選擇?Service1。然后,在“屬性”窗口中,將?Service1?的?ServiceName?和“(名稱)”屬性設置為“MyNewService”

  4. 將?AutoLog?屬性設置為?true

  5. 在“視圖”菜單中單擊“代碼”以打開“代碼編輯器”。編輯?Main?方法以創建“MyNewService”的實例。當在步驟 3 中重命名服務時,未在?Main?方法中修改類名。在 Visual C# 和 Visual J# 應用程序中,Main?方法分別位于 Program.cs 和 Program.js 文件中。

    C#
    VB
    static void Main()
    {System.ServiceProcess.ServiceBase[] ServicesToRun;// Change the following line to match.ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
    J#
    public static void main(String[] args)
    {System.ServiceProcess.ServiceBase[] ServicesToRun;ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
向服務添加功能

在下一節中,您將把自定義事件日志添加到 Windows 服務中。事件日志與 Windows 服務沒有任何形式的關聯。此處,EventLog?組件用作可以添加到 Windows 服務的組件類型的示例。有關自定義事件日志的更多信息,請參見?如何:創建和移除自定義事件日志。

將自定義事件日志功能添加到服務中

  1. 在“解決方案資源管理器”中,右擊“Service1.vb”、“Service1.cs”或“Service1.jsl”,并選擇“視圖設計器”。

  2. 從“工具箱”的“組件”選項卡,將?EventLog?組件拖到設計器中。

  3. 在“解決方案資源管理器”中,右擊“Service1.vb”、“Service1.cs”或“Service1.jsl”,并選擇“查看代碼”。

  4. 編輯構造函數以定義一個用戶事件日志。

    C#
    VB
    public MyNewService()
    {InitializeComponent();if (!System.Diagnostics.EventLog.SourceExists("MySource")) {         System.Diagnostics.EventLog.CreateEventSource("MySource","MyNewLog");}eventLog1.Source = "MySource";eventLog1.Log = "MyNewLog";
    }
    J#
    public MyNewService()
    {InitializeComponent();if (!System.Diagnostics.EventLog.SourceExists("MySource")){System.Diagnostics.EventLog.CreateEventSource("MySource", "MyNewLog");}eventLog1.set_Source("MySource");eventLog1.set_Log("MyNewLog");
    }

定義當服務啟動時發生的情況

  • 在代碼編輯器中,找到創建項目時被自動重寫的?OnStart?方法,并編寫代碼來確定當服務開始運行時發生的情況:

    C#
    VB
    protected override void OnStart(string[] args)
    {eventLog1.WriteEntry("In OnStart");
    }
    J#
    protected void OnStart(String[] args)
    {eventLog1.WriteEntry("In OnStart");
    }
    Note注意

    服務應用程序設計為長時間運行。因此,它通常輪詢或監視系統中的情況。監視是在?OnStart?方法中設置的。但是,OnStart?實際上不進行監視。一旦服務的操作開始,OnStart?方法必須返回到操作系統。它不能始終循環或阻止。若要設置簡單的輪詢機制,可以使用?System.Timers.Timer?組件。在?OnStart?方法中,可以設置組件上的參數,然后將?Enabled?屬性設置為?true。然后,計時器將在代碼中周期性地引發事件,此時,服務可以進行其監視工作。

定義當服務停止時發生的情況

  • 在“代碼編輯器”中,從“方法名稱”下拉列表中選擇?OnStop?過程,該過程是創建項目時自動重寫的。編寫代碼以確定服務停止時發生的情況:

    C#
    VB
    protected override void OnStop()
    {eventLog1.WriteEntry("In onStop.");
    }
    J#
    protected void OnStop()
    {eventLog1.WriteEntry("In onStop.");
    }

還可以重寫?OnPause、OnContinue?和?OnShutdown?方法來定義對組件的進一步處理。

定義服務的其他操作

  • 對于要處理的方法,重寫適當的方法并定義要發生的操作。

    下面的代碼顯示重寫?OnContinue?方法時代碼的情況:

    C#
    VB
    protected override void OnContinue()
    {eventLog1.WriteEntry("In OnContinue.");
    }  
    J#
    protected void OnContinue()
    {eventLog1.WriteEntry("In OnContinue.");
    }

安裝 Windows 服務時需要執行某些自定義操作,這可以由?Installer?類來完成。Visual Studio 可以專門為 Windows 服務創建這些安裝程序并將它們添加到項目中。

為服務創建安裝程序

  1. 在“解決方案資源管理器”中,右擊“Service1.vb”、“Service1.cs”或“Service1.jsl”,并選擇“視圖設計器”。

  2. 單擊設計器的背景以選擇服務本身,而不是它的任何內容。

  3. 設計器具有焦點時,右擊然后單擊“添加安裝程序”。

    默認情況下,向您的項目添加包含兩個安裝程序的組件類。將該組件命名為 ProjectInstaller,它包含的安裝程序分別是服務的安裝程序和服務關聯進程的安裝程序。

  4. 在“ProjectInstaller”的“設計”視圖中,單擊“ServiceInstaller1”或“serviceInstaller1”。

  5. 在“屬性”窗口中,將?ServiceName?屬性設置為“MyNewService”

  6. 將?StartType?屬性設置為?Automatic。

  7. 在設計器中單擊“ServiceProcessInstaller1”(對于 Visual Basic 項目)或“serviceProcessInstaller1”(對于 Visual C# 或 Visual J# 項目)。將?Account?屬性設置為?LocalService。這將使得在本地服務帳戶上安裝和運行該服務。

    Security note安全注意

    LocalService?帳戶用作本地計算機上的非特權用戶,向任何遠程服務器顯示匿名憑據。使用其他帳戶時需要特別小心,因此它們具有較高的特權,會增加您受到惡意代碼攻擊的風險。

生成服務項目

  1. 在“解決方案資源管理器”中,右擊選擇您的項目并從快捷菜單中選擇“屬性”。出現項目的“屬性設計器”。

  2. 從“應用程序”頁的“啟動對象”列表中選擇“MyNewService”。

  3. 按 Ctrl+Shift+B 生成項目。

生成項目后,便可以對其進行部署了。安裝項目將安裝已編譯的項目文件并運行要運行 Windows 服務所需的安裝程序。若要創建完整的安裝項目,您需要將項目輸出 MyNewService.exe 添加到安裝項目,然后添加自定義操作來安裝 MyNewService.exe。有關安裝項目的更多信息,請參見?安裝項目。有關自定義操作的更多信息,請參見?演練:創建自定義操作。

為服務創建安裝項目

  1. 在“解決方案資源管理器”中,右擊選擇解決方案,指向“添加”,然后單擊“新建項目”。

  2. 在“項目類型”窗格中選擇“安裝和部署項目”文件夾。

  3. 在“模板”窗格中選擇“安裝項目”。將項目命名為 MyServiceSetup。單擊“確定”。

    安裝項目隨即添加到解決方案。

然后,將 Windows 服務項目的輸出?MyNewService.exe?添加到安裝項目中。

向安裝項目添加 MyNewService.exe

  1. 在“解決方案資源管理器”中,右擊“MyServiceSetup”,指向“添加”,然后選擇“項目輸出”。

    出現“添加項目輸出組”對話框。

  2. 并且在“項目”框中選擇了“MyNewService”。

  3. 在列表框中,選擇“主輸出”,再單擊“確定”。

    MyNewService 的主輸出的項目項被添加到安裝項目中。

現在添加自定義操作以安裝 MyNewService.exe 文件。

向安裝項目添加自定義操作

  1. 在“解決方案資源管理器”中右擊安裝項目,指向“視圖”,再選擇“自定義操作”。

    出現“自定義操作”編輯器。

  2. 在“自定義操作”編輯器中右擊“自定義操作”節點,再選擇“添加自定義操作”。

    出現“選擇項目中的項”對話框。

  3. 在列表框中雙擊“應用程序文件夾”以將其打開,選擇“MyNewService 的主輸出(活動)”,再單擊“確定”。

    主輸出被添加到自定義操作的所有四個節點:“安裝”、“提交”、“回滾”和“卸載”。

  4. 在“解決方案資源管理器”中,右擊“MyServiceSetup”項目并選擇“生成”。

安裝 Windows 服務

  1. 若要安裝“MyNewService.exe”,請右擊“解決方案資源管理器”中的安裝項目,再選擇“安裝”。

  2. 完成“安裝向導”中的步驟。生成并保存您的解決方案。

啟動和停止服務

  1. 通過執行下列操作之一打開服務控制管理器:

    • 在 Windows XP 和 2000 專業版中,在桌面上右擊“我的電腦”,再單擊“管理”。在“計算機管理”控制臺中,展開“服務和應用程序”節點。

      - 或 -

    • 在 Windows Server 2003 和 Windows 2000 Server 中,單擊“開始”,指向“程序”,單擊“管理工具”,然后單擊“服務”。

      Note注意

      在 Windows NT 4.0 版中,可以從“控制面板”中打開此對話框。

    現在應該看到“MyNewService”列在窗口的“服務”區域中。

  2. 從列表中選擇您的服務,右擊該服務,然后單擊“啟動”。

  3. 右擊該服務,再單擊“停止”。

驗證服務的事件日志輸出

  1. 打開“服務器資源管理器”并訪問“事件日志”節點。有關更多信息,請參見?如何:在服務器資源管理器中使用事件日志。

    Note注意

    Visual Studio 標準版中不提供“Windows 服務”模板及相關功能。有關更多信息,請參見?Visual Studio 版本。

  2. 找到 MyNewLog 的列表并展開它。您應該看到服務所執行操作的項。

卸載服務

  1. 在“開始”菜單上打開“控制面板”并單擊“添加/刪除程序”,再找到您的服務并單擊“卸載”。

  2. 還可以通過右擊 .msi 文件的程序圖標并選擇“卸載”來卸載該程序。

    Note注意

    如果在 Windows 2000 上安裝了服務,則需要重新啟動系統才能重新安裝服務。在 Windows 2000 中,服務在系統重新啟動之前不會完全刪除。

后續步驟

可以利用?ServiceController?組件將命令發送到已安裝的服務。有關使用?ServiceController?控件的更多信息,請參見?監視 Windows 服務。

可以在安裝應用程序時使用安裝程序創建事件日志,而不是在運行應用程序時創建事件日志。此外,在卸載應用程序時,事件日志將被安裝程序刪除。有關更多信息,請參見?演練:安裝事件日志組件。

請參見

任務

如何:將安裝程序添加到服務應用程序?
如何:安裝和卸載服務?
如何:調試 Windows 服務應用程序?
如何:啟動事件查看器?

參考

如何:訪問和初始化服務器資源管理器/數據庫資源管理器?

概念

Windows 服務應用程序介紹?

其他資源

Windows 服務應用程序

轉載于:https://www.cnblogs.com/xust/articles/2736612.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260292.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

絕對震撼 7款HTML5動畫應用及源碼

除非特別聲明,PHP100新聞均為原創或投稿報道,轉載請注明作者及原文鏈接 原文地址: http://www.php100.com/html/it/mobile/2014/0702/7030.html [導讀] 關于HTML5動畫,我們已經分享太多了,當然也有很多利用純CSS3實現的…

maven打包指定main函數

2019獨角獸企業重金招聘Python工程師標準>>> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> …

java 任意數平均值_【編程題】通過鍵盤輸入三個任意的數字,計算三個值的平均值,并輸出結果。...

【單選題】對放大電路測試NPN型硅管測得Ube>0,Ubc>0,Uce>0【簡答題】Even ordinary men understand now that the universe is something vaster and broader than ever thought before.【單選題】【其它】The Einsteins,however,could not afford to pay for the adv…

【轉】Direct3D頂點結構使用總結

【轉】Direct3D頂點結構使用總結 D3D里面最基本的就是頂點了&#xff0c;雖說一直在用&#xff0c;可是卻也是自己比較模糊的一個點&#xff0c;知道其中的意思&#xff0c;卻不是很清楚&#xff0c;今天就總結一下&#xff0c;掃一下這個盲區&#xff1a; D3D中的頂點緩沖區的…

quick cocos2d-x 精靈大小(寬高)獲取

quick下sprite的大小獲取&#xff0c;記錄一下&#xff1a; local w sprite:getContentSize().width local h sprite:getContentSize().height 今天連這個最基本的&#xff0c;都不知道怎么獲取。挺實用的代碼額~轉載于:https://www.cnblogs.com/vokie/p/3822248.html

velocityjs 動畫庫 比jquery默認的animate強

神坑記錄&#xff1a; 1、transform: translate3d(80%,0,0); 無法作為參數&#xff0c;必須修改為這種&#xff1a;translateX: 0% 官方文檔 http://velocityjs.org/ github地址 https://github.com/julianshapiro/velocity npm下載安裝 npm install velocity-animate --save-d…

python中的可變數據類型有列表和元組_Python中列表的 += 和 .extend() 的異同

一道Python題最近有朋友“考”了我一個Python的題&#xff1a;使用和.extend()兩種方法擴展元組中的列表會發生什么。雖然我對Python中的可變數據類型、不可變數據類型的概念都有較深的理解&#xff0c;并且也對list的、、.extend()、.append()做過性能分析&#xff0c;但是和.…

簡易貪吃蛇小游戲java版_用GUI實現java版貪吃蛇小游戲

本文實例為大家分享了java版貪吃蛇小游戲的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下項目結構新建一個JFrame窗口,作為程序入口public class GameStart{public static void main(String[] args) {JFrame jFrame new JFrame();jFrame.setBounds(100,100,900,720…

幾種代價函數

SAD&#xff08;Sum of Absolute Difference&#xff09;SAE&#xff08;Sum of Absolute Error)即絕對誤差和 SATD&#xff08;Sum of Absolute Transformed Difference&#xff09;即hadamard變換后再絕對值求和 SSD&#xff08;Sum of Squared Difference&#xff09;SSE&am…

Markdown文件導出為HTML的小程序

Markdown文件導出為HTML的小程序為什么做 最近把一些學習經驗記下來&#xff0c;總結成MarkDown文件&#xff0c;不知不覺已經有12篇了。 Sublime Text 的 MarkDown Preview 插件能夠將MarkDown語法轉換為HTML&#xff0c;并提供三種預覽方式&#xff1a;瀏覽器預覽、保存為HTM…

python制作自動回復腳本_python itchat實現微信自動回復的示例代碼

今天在實驗樓發現一個特別好玩的&#xff0c;Python 微信庫itchat,可以實現自動回復等多種功能&#xff0c;好玩到根本停不下來啊&#xff0c;尤其是調戲調戲不懂計算機的&#xff0c;特別有成就感&#xff0c;哈哈&#xff01;&#xff01;代碼如下&#xff1a;#codingutf8imp…

pta龜兔賽跑Java_PTA-龜兔賽跑

烏龜與兔子進行賽跑&#xff0c;跑場是一個矩型跑道&#xff0c;跑道邊可以隨地進行休息。烏龜每分鐘可以前進3米&#xff0c;兔子每分鐘前進9米&#xff1b;兔子嫌烏龜跑得慢&#xff0c;覺得肯定能跑贏烏龜&#xff0c;于是&#xff0c;每跑10分鐘回頭看一下烏龜&#xff0c;…

視頻壓縮算法的相關知識

視頻壓縮算法的相關知識MPEG-1MPEG 視頻壓縮編碼后包括三種元素&#xff1a;I幀&#xff08;I-frames&#xff09;、P幀&#xff08;P-frames&#xff09;和B幀&#xff08;B-frames&#xff09;。在MPEG編碼的過程中&#xff0c;部分視頻幀序列壓縮成為I幀&#xff1b;部分壓縮…

安裝MariaDB數據庫(未完成)

1轉載于:https://www.cnblogs.com/centos7/p/5994533.html

python接口開發django_用 Django 開發接口

環境搭建1、pip install django2.2.0一、django-admin startproject UITESTpython manage.py startapp paltform創建Django項目1. 創建方式&#xff1a;#方式1&#xff1a;終端輸入django-admin startproject UITEST#方式2:pycharm中新建django項目在settings.py文件中添加應用…

戒掉dota

立言為證。 每次不想學習想到dota就強迫自己去培養的興趣。 比如看一本喜歡的書&#xff1b;比如去跑個步&#xff1b;比如研究某個興趣點寫個報告&#xff1b;比如寫份隨筆。 轉載于:https://www.cnblogs.com/hongxia/p/3830348.html

java切入式編程顯示屏_C語言嵌入式系統編程修煉之四:屏幕操作

C語言嵌入式系統編程修煉之四:屏幕操作作者:宋寶華 更新日期:2005-07-22漢字處理現在要解決的問題是&#xff0c;嵌入式系統中經常要使用的并非是完整的漢字庫&#xff0c;往往只是需要提供數量有限的漢字供必要的顯示功能。例如&#xff0c;一個微波爐的LCD上沒有必要提供顯…

DIV的邊距屬性在Chrome和IE中的區別

突然間&#xff0c;在Chrome下看起來很整齊的布局&#xff0c;在IE下變成一團糟。為了找出原因&#xff0c;我改動了div的background-color屬性。最后&#xff0c;發現同一個DIV的寬度在IE和Chrome下卻不一樣。這大晚上的&#xff0c;真是怪嚇人滴&#xff01; 之后&#xff0c…

算法之矩陣計算斐波那契數列

算法之矩陣計算斐波那契數列 本節內容 斐波那契介紹普通方式求解斐波那契矩陣概念矩陣求冪矩陣求解斐波那契1.斐波那契介紹 斐波那契數列有關十分明顯的特點&#xff0c;那是&#xff1a;前面相鄰兩項之和&#xff0c;構成了后一項。即f(n)f(n-1)f(n-2),f(0)0,f(1)f(2)1,推導下…

python中去除字符串中首尾空格的函數_Python中去除字符串首尾特定字符的函數:strip()...

Python中strip()函數的作用是去除一個字符串前導和尾部的特定字符&#xff0c;并返回結果字符串。Python中strip()函數默認是刪除字符串前導和尾部空格&#xff0c;通過設定參數&#xff0c;也可以去除字符串前導和尾部的其它特定字符。strip()函數的語法格式str.strip( [ char…