C# create Windows Service

 
    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 "; //  进程  
             #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  
        }  
    }  

转载于:https://www.cnblogs.com/hayden/archive/2012/02/22/2362607.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值