• 用C#创建Windows服务(Windows Services)


    用C#创建Windows服务(Windows Services)

    学习:

     第一步:创建服务框架 
    创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名

    ,然后点击 确定。现在项目中有个Service1.cs类:

    查看其各属性的含意是:

             Autolog                 是否自动写入系统的日志文件
             CanHandlePowerEvent     服务时候接受电源事件
             CanPauseAndContinue     服务是否接受暂停或继续运行的请求
             CanShutdown             服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程
             CanStop                 服务是否接受停止运行的请求
             ServiceName             服务名

    第二步:向服务中增加功能 
    在 .cs代码文件中我们可以看到,有两个被忽略的函数 OnStart和OnStop。

    OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。这个例子是:当启动和停止服务时,定时显示“hello,你好”;息

    ,首先在Service1.cs设计中拖个timer控件,设置好它的Interval=60000,与要做的功能
    代码如下:

     //OnStart函数在启动服务时执行
            protected override void OnStart(string[] args)
            {
                this.timer1.Start();
            }
           // OnStop函数在停止服务时执行
            protected override void OnStop()
            {
                this.timer1.Stop();
            }

            private void timer1_Tick(object sender, EventArgs e)
            {
                 System.Diagnostics.Process.Start("http://www.baidu.com");
            }

     第三步: 将安装程序添加到服务应用程序

         

           将安装程序添加到服务应用程序的步骤是:

    1:在解决方案中,右击服务Service1.cs设计视图。

    2:在属性窗口中,单击-添加安装程序

    这时项目中就添加了一个新类 ProjectInstaller 和两个安装组件 ServiceProcessInstaller 和 ServiceInstaller,并且服务

    的属性值被复制到组件。

    3:若要确定如何启动服务,请单击 ServiceInstaller 组件并将 StartType 属性设置为适当的值。

             Manual      服务安装后,必须手动启动。

             Automatic    每次计算机重新启动时,服务都会自动启动。

             Disabled     服务无法启动。

    4:将serviceProcessInstaller类的Account属性改为 LocalSystem

         这样,不论是以哪个用户登录的系统,服务总会启动。

    第四步:生成服务程序

    通过从生成菜单中选择生成来生成项目shift+F6。或重新生成项目注意   不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。

    第五步:服务的安装与卸载

    访问项目中的已编译可执行文件所在的目录。 
    用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码: 
    installutil WindowsService1.exe

    卸载服务 
    用项目的输出作为参数,从命令行运行 InstallUtil.exe。

    installutil /u WindowsService1.exe

    附:installutil.exe 在安装VS电脑的C:WINDOWSMicrosoft.NETFrameworkv2.0.50727InstallUtil.exe 
    到vs2008命令提示符下installutil.exe /?可以查看其帮助说明

    推荐的另一中安装服务的方法
     用winform来调用安装,当点击按钮时,安装服务.
    1.项目需要添加引用System.Configuration.Install和System.ServiceProcess

    代码如下:
    using System.Configuration.Install;
    using System.ServiceProcess;
    /// <summary>   
       /// 安装服务   
       /// </summary>   
       private void btnInstall_Click(object sender, EventArgs e)   
       {   
             string[] args = { "WindowsService1.exe" };
               //卸载服务 string[] args = {"/u", "WindowsService1.exe"};  
                if (!ServiceIsExisted("Service1"))//这里的Service1是对应真实项目中的服务名称
                {
                    try
                    {
                        ManagedInstallerClass.InstallHelper(args);  //参数 args 就是你用 InstallUtil.exe 工具安装时的

    参数。一般就是一个exe的文件名 
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        return;
                    }
                }
                else
                {
                    MessageBox.Show("该服务已经存在,不用重复安装。");
                }
       } 


    /// <summary>   
    /// 检查指定的服务是否存在。   
    /// </summary>   
    /// <param name="serviceName">要查找的服务名字</param>   
    /// <returns></returns>   
    private bool ServiceIsExisted(string svcName)   
    {   
        ServiceController[] services = ServiceController.GetServices();   
        foreach (ServiceController s in services)   
        {   
            if (s.ServiceName == svcName)   
            {   
                return true;   
            }   
        }   
        return false;   

    通过System.Configuration.Install.ManagedInstallerClass 类中的静态方法 InstallHelper就可以实现手工安装。 该方法的

    签名如下: 
    public static void InstallHelper(string[] args) 
    其中参数 args 就是你用 InstallUtil.exe 工具安装时的参数。一般就是一个exe的文件名


    第六步:调试服务

    安装后,服务不会自动启动,服务不可以与桌面交互

    1.设置服务安装后自动启动
    添加serviceInstaller1的AfterInstall事件
    using System.Diagnostics;
     private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
            {
               System.ServiceProcess.ServiceController s = new System.ServiceProcess.ServiceController("Service1");
                s.Start();//设置服务安装后立即启动
            }


    2.设置允许服务与桌面交互方法

    让服务启动某个应用程序,就要修改服务的属性,勾选允许服务与桌面交互,

    #region 设置服务与桌面交互

            /// <summary>
            /// 设置服务与桌面交互,在serviceInstaller1的AfterInstall事件中使用
            /// </summary>
            /// <param name="serviceName">服务名称</param>
            private void SetServiceDesktopInsteract(string serviceName)
            {
                System.Management.ManagementObject wmiService = new System.Management.ManagementObject(string.Format

    ("Win32_Service.Name='{0}'", serviceName));
                System.Management.ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change");
                changeMethod["DesktopInteract"] = true;
                System.Management.ManagementBaseObject utParam = wmiService.InvokeMethod("Change", changeMethod,

    null);
            }
            #endregion

    3.windows服务是不执行Timer控件的,解决办法
    把上面用到的Timer控件清除
    public Service1()
            {
                InitializeComponent();

                System.Timers.Timer t = new System.Timers.Timer();
                t.Interval =1000*15;
                t.Elapsed += new System.Timers.ElapsedEventHandler(RunWork);
                t.AutoReset = true;//设置是执行一次(false),还是一直执行(true);
                t.Enabled = true;//是否执行

            }


     public void RunWork(object source, System.Timers.ElapsedEventArgs e)
            { 
               //要定时处理的事情
              //这样服务就可以定时执行任务了
            }

    总结:windows服务编程
    1.服务不会执行Timer控件
    2.默认服务安装完成后,是不会自动启动,不能与桌面交互
    3.安装服务时,推荐新建个winform项目,用winform项目来执行服务的安装与卸载
    4.OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。
    5.右击-将服务添加到应用程序

     ======================================================================

    C# 创建Windows服务。服务功能:定时操作数据库

     

    一、创建window服务

    1、新建项目-->选择Windows服务。默认生成文件包括Program.cs,Service1.cs

    2、在Service1.cs添加如下代码:

           System.Timers.Timer timer1;  //计时器

            public Service1()

            {

                InitializeComponent();

            }

            protected override void OnStart(string[] args)  //服务启动执行

            {

                timer1 = new System.Timers.Timer();

                timer1.Interval = 3000;  //设置计时器事件间隔执行时间

                timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);

                timer1.Enabled = true;

            }

            protected override void OnStop()  //服务停止执行

            {

                this.timer1.Enabled = false;

            }

     

            private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

            {

                //执行SQL语句或其他操作

            }

     

    二、添加window服务安装程序

    1、打开Service1.cs【设计】页面,点击右键,选择【添加安装程序】,会出现serviceInstaller1和serviceProcessInstaller1两个组件

    2、将serviceProcessInstaller1的Account属性设为【LocalSystem】, serviceInstaller1的StartType属性设为【Automatic】,ServiceName属性可设置服务名称,此后在【管理工具】--》【服务】中即显示此名称

    3、ProjectInstaller.cs文件,在安装服务后一般还需手动启动(即使上述StartType属性设为【Automatic】),可在ProjectInstaller.cs添加如下代码实现安装后自动启动

        public ProjectInstaller()
            {
                InitializeComponent();
                this.Committed += new InstallEventHandler(ProjectInstaller_Committed);   
            }

            private void ProjectInstaller_Committed(object sender, InstallEventArgs e)
            {
                //参数为服务的名字
                System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("服务名称");
                controller.Start();
            }   

     

    三、安装、卸载window服务

    1、输入cmd(命令行),

       4.0:cd C:WINDOWSMicrosoft.NETFrameworkv4.0.30319

         2.0:cd C:WINDOWSMicrosoft.NETFrameworkv2.0.50727

    2、安装服务(项目生成的exe文件路径)

      InstallUtil "E:WindowsService1inDebugWindowsService1.exe"

    3、卸载服务

      InstallUtil  /u "E:WindowsService1inDebugWindowsService1.exe"

    四、查看window服务

        services.msc

    控制面板-->管理工具-->服务,可在此手动启动,停止服务

    五、调试window服务

    1、通过【事件查看器】查看

    2、直接在程序中调试(菜单-->调试-->附加进程-->服务名(这里的服务名是项目名称,不是ServiceName属性自定义的名称,所以建议自定义名称和项目名称保持一致,另外需勾选【显示所有用户的进程】才能看到服务名)-->附加

       这里附加的进程名应该是:WindowsService1.exe 而不是 WindowsService1.vshost.exe。WindowsService1.exe 默认不会出现,必须勾选【显示所有用户的进程】【显示所有会话中的进程】

    3. 在程序中打断点调试即可,另外调试服务时服务必须已启动(管理工具-->服务)

     

    转自:http://blog.itpub.net/23109131/viewspace-688117/

  • 相关阅读:
    Selenium+java
    小白学习安全测试(一)——Http协议基础
    解决chrome运行报错unknown error: cannot get automation extension
    Eclipse 中 不能创建 Dynamic web project
    Jmeter遇到Connection reset by peer的解决方法
    用Java检测远程主机是否能被连接
    Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息
    jenkins的svn路径中文问题
    MySql的存储引擎介绍
    Netty SSL性能调优
  • 原文地址:https://www.cnblogs.com/dare/p/4305903.html
Copyright © 2020-2023  润新知