如何用C#创建Windows Service

来源:互联网 发布:张作霖的功与过 知乎 编辑:程序博客网 时间:2024/05/16 06:34
在.Net中用C#创建Windows Service,其实很简单,按照以下的步骤就可以做出一个简单的Windows Service。
1.首先在创建工程的时候选择Windows Service,这样.Net会自动生成Windows Service的框架;
2.完成Windows Service的相应事件,主要是OnStart和OnStop这两个事件,完成后大致代码如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.IO;
using System.Threading;
namespace WinSDemo
{
    public class WinSDemo : System.ServiceProcess.ServiceBase
    {
        ///<summary>
        /// Required designer variable.
        ///</summary>
        private System.ComponentModel.Container components = null;
        private bool blnStopThread;
        private Thread thdMain;
 
        public WinSDemo()
        {
            // This call is required by the Windows.Forms Component Designer.
            InitializeComponent();
 
            // TODO: Add any initialization after the InitComponent call
        }
 
        // The main entry point for the process
        static void Main()
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun;
   
            // More than one user Service may run within the same process. To add
            // another service to this process, change the following line to
            // create a second service object. For example,
            //
            ServicesToRun = new System.ServiceProcess.ServiceBase[] { new WinSDemo() };
 
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }
 
        ///<summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        ///</summary>
        private void InitializeComponent()
        {
            //
            // WinSDemo
            //
            this.CanPauseAndContinue = true;
            this.ServiceName = "MyTest";
 
        }
 
        ///<summary>
        /// Clean up any resources being used.
        ///</summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
 
        ///<summary>
        /// Set things in motion so your service can do its work.
        ///</summary>
        protected override void OnStart(string[] args)
        {
            // TODO: Add code here to start your service.
 
            thdMain=new Thread(new ThreadStart(WriteLog));
            thdMain.Start();
        }
 
        ///<summary>
        /// Stop this service.
        ///</summary>
        protected override void OnStop()
        {
            // TODO: Add code here to perform any tear-down necessary to stop your service.
            blnStopThread=true;
            thdMain.Join();
        }
 
        protected override void OnPause()
        {
            thdMain.Suspend();
        }
 
        protected override void OnContinue()
        {
            thdMain.Resume();
        }
 
        protected void WriteLog()
        {
            StreamWriter myWriter=null;        
            do
            {
                Process.Start("net","send localhost yourValue");
                try
                {
                    myWriter=new StreamWriter("c://MyLog.txt",true);
                    myWriter.WriteLine(DateTime.Now.ToString());
                    myWriter.Close();
                }
                catch{};
 
                Thread.Sleep(5000);
            }while(blnStopThread==false);
           
        }
    }
}
       注:为了使自己能更好的识别自己写的Windows Service,建议在InitializeComponent修改Service的名称。
 
3.为了使自己写的Service能加载到系统中去,光靠以上步骤是不够;接下来,向当前的工程添加Service Installer,在其中设置Service安装后的起始状态,代码如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
 
 
namespace WinSDemo
{
    ///<summary>
    /// Summary description for WinSDemoIns.
    ///</summary>
    [RunInstaller(true)]
    public class WinSDemoIns : System.Configuration.Install.Installer
    {
        ///<summary>
        /// Required designer variable.
        ///</summary>
        private System.ComponentModel.Container components = null;
        private ServiceInstaller serviceInstaller;
        private ServiceProcessInstaller processInstaller;
 
        public WinSDemoIns()
        {
            // This call is required by the Designer.
            InitializeComponent();
 
            // TODO: Add any initialization after the InitComponent call
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller = new ServiceInstaller();
 
            // Service will run under system account
            processInstaller.Account = ServiceAccount.LocalSystem;
 
            // Service will have Start Type of Manual
            serviceInstaller.StartType = ServiceStartMode.Automatic;
 
            serviceInstaller.ServiceName = "MyTest";
 
            Installers.Add(serviceInstaller);
            Installers.Add(processInstaller);
        }
 
        #region Component Designer generated code
        ///<summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        ///</summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }
        #endregion
    }
}
 
4.完成以上的步骤,代码的部分就完成了,编译成可执行文件,再用.Net的Service安装工具就行了,即在Dos窗口中,键入“installutil yourService.exe”,这样执行就可以了,相反,如果想卸载Service的话,加一个参数就可以了,即“installutil /u yourService.exe”。注意有可能.Net的路径在环境变量中不存在,可能直接执行是不能成功的,希望先找到“installutil.exe”存在的目录,大致在“/WINDOWS/Microsoft.NET/Framework/v1.1.4322”目录下。
 
至于以后Service的部署,由于.Net写的程序,运行环境必须要安装.Net Framework,所以在其他机器安装自己写的Service时候,一定要先安装.Net运行环境。
 
原创粉丝点击