一步步開發Windows服務(Windows Service)[轉]


基於0起步來創建一個服務,做到簡單的記錄時間日志功能,其具體招行方法可自行添加。

1.創建服務

2.刪除默認服務文件

3.添加自己的服務文件

4.更改啟動項目

5. 引用 using System.Timers;並添加FileClass類

FileClass類

按 Ctrl+C 復制代碼
按 Ctrl+C 復制代碼

6. 添加上步中需要的InitService()方法

復制代碼
/// <summary>
        /// 初始化服務參數
        /// </summary>
        private void InitService()
        {
            base.CanShutdown = true;
            base.CanStop = true;
            base.CanPauseAndContinue = true;
            this.ServiceName = MainService.serviceName;
            this.AutoLog = false;//為了使用自定義日志,必須將 AutoLog 設置為 false

            tim = new System.Timers.Timer();
            tim.Elapsed += new ElapsedEventHandler(tim_Elapsed);
            tim.Interval = 5000;
            tim.AutoReset = true;
        }
復制代碼

7. 解決System不包含windows屬性問題,引用程序集。

8.添加上面引用 的 tim_Elapsed 定時方法

復制代碼
 private void tim_Elapsed(object sender, EventArgs e)
        {
            StartThread();
        }

        /// <summary>  
        /// 開始任務 
        /// </summary>  
        private void StartThread()
        {
            MessageAdd(serviceName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        /// <summary>  
        ///  日志記錄
        /// </summary>  
        /// <param name="serviceName">內容</param>  
        public void MessageAdd(string str)
        {
            try
            {
                fileclass.WriteLogFile(logPath, str);//寫入記錄日志
            }
            catch
            {

            }
        }
復制代碼

9.此時生成解決方案是成功的

10.在OnStart等中寫入自己的方法,這里用日志記錄

復制代碼
   protected override void OnStart(string[] args)
        {
            try
            {
                this.tim.Enabled = true;
                this.tim.Start();
            }
            catch (Exception ex)
            {
                MessageAdd("OnStart錯誤:" + ex.Message);
            }
            MessageAdd(serviceName + "已成功啟動!");
        }

        protected override void OnStop()
        {
            try
            {
                this.tim.Stop();
            }
            catch (Exception ex)
            {
                MessageAdd("OnStop錯誤:" + ex.Message);
            }
            MessageAdd(serviceName + "已停止!");
        }

        protected override void OnContinue()
        {
            this.tim.Start();
            base.OnContinue();
        }

        protected override void OnPause()
        {
            this.tim.Stop();
            base.OnPause();
        }
復制代碼

11.給服務添加安裝程序。右鍵鼠標單擊MainService.cs[設計]*選項卡選項“添加安裝程序”。

12.可以看見項目中多了如下文件和組件,serviceProcessInstaller1、serviceInstaller1是自動生成的

13.設置組件serviceInstaller1的主要屬性,StartType: AutoMatic自動啟動;ServiceName: 服務系統標識,在cmd命令中執行sr start/stop/query等等命令時候使用,用來唯一標識一個Window服務

 

14.設置組件serviceProcessInstaller1的主要屬性,Accout:賬戶類型,LocalSystem本地系統服務;

15.設置服務安裝后“允許和桌面進行交互”,

需要在ProjectInstaller.cs中添加如下代碼。

復制代碼
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;


namespace TerminalTrance
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
        }

        protected override void OnAfterInstall(IDictionary savedState)
        {

            try
            {

                base.OnAfterInstall(savedState);

                // 允許服務桌面交互

                System.Management.ManagementObject myService = new System.Management.ManagementObject(string.Format("Win32_Service.Name='{0}'", this.serviceInstaller1.ServiceName));

                System.Management.ManagementBaseObject changeMethod = myService.GetMethodParameters("Change");

                changeMethod["DesktopInteract"] = true;

                System.Management.ManagementBaseObject OutParam = myService.InvokeMethod("Change", changeMethod, null);

            }

            catch (Exception ex)
            {

            }

        }
    }
}
復制代碼

16.Windows服務的安裝和卸載

代碼寫完后,編譯通過后,就可以安裝、卸載、調試服務了。

在執行安裝或卸載服務前,我有把服務需要的相關文件,復制到C:\Service\下面或其他路徑。一旦安裝完成后,此目錄不能變更,否則不能卸載該服務和服務運行會報錯。

安裝、卸載很簡單,只要在VS命令行導航到,服務程序的路徑。然后運行以下命令就OK了。

打開如圖:

安裝服務:installutil C:\Service\TerminalTrance.exe

卸載服務:installutil /u C:\Service\TerminalTrance.exe

調試的話,只能先安裝啟動服務,然后將該服務附加到進程,就可以調試了。安裝好服務后,就可以在win7服務管理里面,管理剛剛啟動的服務了。

 安裝成功后可在服務中看到

 在服務程序中可以看到添加的服務

可以看到程序的日志記錄

另外一個方法是生成安裝exe程序

1.解決方案右鍵=》新建項目=》選擇安裝程序

2.安裝項目右鍵=》添加=》項目輸出,選擇主項目

3.安裝項目右鍵=》視圖=》自定義操作

4.自定義操作=》安裝右鍵=》選擇主輸出

5.卸載右鍵=》選擇主輸出

6.若有文件需要添加到安裝后的文件夾中=》點擊應用程序文件夾=》添加=》文件,選擇文件。安裝后就會生成指定文件。

7.生成程序,完成,Setup文件夾中找到exe安裝文件執行就 OK了。卸載也是執行此exe,按提示下一步就OK。

作者: 歡醉
公眾號【一個碼農的日常】 技術群:319931204 1號群: 437802986 2號群: 340250479
出處: http://zhangs1986.cnblogs.com/
碼雲: https://gitee.com/huanzui
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 

完成開發后,對整各項目進行編譯生成。在windows服務開發文件夾“\bin\Debug”下,就是我們需要安裝的服務,建議把里面的所有文件拷貝至系統里的某個目錄進行安裝。

  我是把整個個文件夾里的文件拷貝到c:\WindowService文件夾下。然后打開目錄C:\Windows\Microsoft.NET\Framework64\v4.0.30319,拷貝里面的InstallUtil.exe文件至c:\WindowService文件夾下)。

  注意:我的系統是windows10,64位系統,我的服務也將安裝至64位系統下,所以我是進入C:\Windows\Microsoft.NET\Framework64\v4.0.30319目錄拷貝InstallUtil.exe文件。各位安裝的時候,根據你安裝的目標系統,來覺得是拷貝哪個framework哪個版本,具體是64位的還是32位的也由你系統決定。

  做好以上工作后就可以安裝了,打開cdm就可執行安裝了(一定要以管理員身份運行喲,要不然安裝時會報“Windows服務安裝異常:System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件”)。

  以下是安裝命令、啟動服務命令、停止服務命令、卸載服務命令:

    安裝命令:C:\WindowService\InstallUtil.exe C:\WindowService\OrganizClientSocketService.exe 

    啟動服務命令:net start 搜才Organiz客戶端數據同步服務

    關閉服務命令:net stop 搜才Organiz客戶端數據同步服務

    卸載服務命令:C:\WindowService\InstallUtil.exe -u C:\WindowService\OrganizClientSocketService.exe


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM