C# 创建window服务

源地址

以前写的后台程序都是用控制台的,刚才尝试了一下这个生成服务的程序,很强大,转载过来,大家看看!

using System;

using System.Threading;

using System.ServiceProcess;

using System.Collections;

using System.Configuration.Install;

using System.Diagnostics;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Collections.Specialized;

using System.IO;

namespace WSGPSServices

{

    public partial class myService : ServiceBase

    {

        #region 成员变量

        public string strCurrPath = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).Directory.FullName;

        public string servicesname = "WSGPSServices";//服务  

        public string Proceename = "WSGPSGateway.exe";// 进程  



        public System.ComponentModel.Container components;

        System.Windows.Forms.Timer Timers;

        #endregion

        protected override void Dispose(bool disposeing)

        {

            if (disposeing)

            {

                if (components != null)

                {

                    components.Dispose();

                }

                Register(servicesname, strCurrPath);

            }

        }

        #region 注册卸载服务

        //注册服务  

        public void Register(string servicesname, string strServiceInstallPath)

        {

            IDictionary mySavedState = new Hashtable();

            try

            {

                System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(servicesname);

                //服务已经存在则卸载    

                if (ServiceIsExisted(servicesname))

                {

                    UnInstallService(servicesname, strCurrPath);

                }

                service.Refresh();

                //注册服务    

                AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();

                mySavedState.Clear();

                myAssemblyInstaller.Path = "WSGPSServices.exe";

                myAssemblyInstaller.UseNewContext = true;

                myAssemblyInstaller.Install(mySavedState);

                myAssemblyInstaller.Commit(mySavedState);

                myAssemblyInstaller.Dispose();

                service.Start();

                ProcessStartInfo startinfo = new ProcessStartInfo("WSGPSGateway.exe");

                startinfo.WindowStyle = ProcessWindowStyle.Hidden;

                startinfo.Arguments = Application.StartupPath + "//WSGPSGateway.exe";

                Process.Start(startinfo);

                InitializeComponent();

            }

            catch (Exception ex)

            {

                throw new Exception("注册服务时出错:" + ex.Message);

            }

        }

        //卸载服务  

        public void UnInstallService(string strServiceName, string strServiceInstallPath)

        {

            try

            {

                if (ServiceIsExisted(servicesname))

                {

                    AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();

                    myAssemblyInstaller.UseNewContext = true;

                    myAssemblyInstaller.Path = "WSGPSServices.exe";

                    myAssemblyInstaller.Uninstall(null);

                    myAssemblyInstaller.Dispose();

                    KillProcess();

                }

            }

            catch (Exception ex)

            {

                throw new Exception("卸载服务时出错:" + ex.Message);

            }

        }

        //卸载服务时结束进程  

        private void KillProcess()

        {

            System.Diagnostics.Process myproc = new System.Diagnostics.Process();//得到所有打开的进程       

            try

            {

                foreach (Process thisproc in Process.GetProcessesByName(Proceename))

                {

                    if (!thisproc.CloseMainWindow())

                    {

                        thisproc.Kill();

                    }

                }

            }

            catch (Exception Exc)

            {

                throw Exc;

            }

        }

        #endregion

        #region 启动服务与应用程序

        //启动服务(启动存在的服务,30秒后启动失败报错)    

        public void StartService(string serviceName)

        {

            if (ServiceIsExisted(servicesname))

            {

                System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController("WSGPSServices");

                if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending)

                {

                    service.Start();

                    for (int i = 0; i < 30; i++)

                    {

                        service.Refresh();

                        System.Threading.Thread.Sleep(1000);

                        if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running)

                        {

                            ProcessStartInfo startinfo = new ProcessStartInfo("WSGPSGateway.exe");

                            startinfo.WindowStyle = ProcessWindowStyle.Hidden;

                            startinfo.Arguments = Application.StartupPath + "//WSGPSGateway.exe";

                            Process.Start(startinfo);

                            break;

                        }

                        if (i == 29)

                        {

                            throw new Exception("服务WSGPS Services启动失败!");

                        }

                    }

                }

            }

        }

        //判断服务是否存在    

        public bool ServiceIsExisted(string serviceName)

        {

            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController s in services)

            {

                if (s.ServiceName == servicesname)

                {

                    return true;

                }

            }

            return false;

        }

        #endregion

        #region Timer定时任务与构造方法

        //Timer构造方法  

        private void InitializeComponent()

        {

            this.components = new System.ComponentModel.Container();

            this.Timers = new System.Windows.Forms.Timer(this.components);

            this.Timers.Enabled = true;

            this.Timers.Interval = 180000;

            this.Timers.Tick += new System.EventHandler(this.Timers_Tick);

        }

        //Timer定时检查任务  

        private void Timers_Tick(object sender, EventArgs e)

        {

            ServiceController[] services = ServiceController.GetServices();

            foreach (ServiceController s in services)

            {

                if (s.ServiceName == servicesname)

                {

                    return;//存在返回空  

                }

                else

                {

                    Register(servicesname, strCurrPath);//无当前服务则重新注册服务  

                }

            }

        }

        #endregion

    }

}

 

留在这里,大家学习!

你可能感兴趣的:(window)