【转】C# 创建window服务

mac2022-06-30  74

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    }}

 

原文地址 :http://www.cppblog.com/jialisoft/archive/2012/10/11/193174.html

转载于:https://www.cnblogs.com/xiaohuaidan/archive/2012/10/17/2728230.html

最新回复(0)