用C# 代碼創建window服務

jopen 12年前發布 | 2K 次閱讀

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 + "http://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 + "http://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
}

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!