• C# 创建 windows服务(转)


    在一个应用程序中创建多个 windows 服务的方法和 1083 错误的解决方法法

    添加‘服务安装成功’后自启动功能

    --------------------------------------------------------------------------------------
    1.创建 windows服务 项目
      文件 -> 新建项目 -> 已安装的模板 -> Visual C# -> windows ,在右侧窗口选择"windows 服务"

    2.系统已经为我们建立了一个 Service1.cs 组件,测试时我们就用它了.
     如果要新件的话,右键项目 -> 添加 -> 新建项 -> windows 服务。

    3.在 Service1.cs 上 ,按 F7 (右键查看代码),打开代码页。加入我们测试用的代码。
      注意:下面的几个方法中的 str 变量,为了我们一会儿调试时设置断点用的!

     using System;
     using System.Diagnostics;
     using System.ServiceProcess;

     namespace WindowsService1
     {
      public partial class Service1 : ServiceBase
      {
       public Service1()
       {
        InitializeComponent();
        InitService();
       }

       /// <summary>
       /// 初始化服务参数
       /// </summary>
       private void InitService()
       {
        base.AutoLog = false;
        base.CanShutdown = true;
        base.CanStop = true;
        base.CanPauseAndContinue = true;
        base.ServiceName = "Service1";  //这个名字很重要,设置不一致会产生 1083 错误哦!
       }
       protected override void OnStart(string[] args)
       {
        string str ="服务开启";
       }

       protected override void OnStop()
       {
        string str ="服务停止";
       }
       protected override void OnContinue()
       {
        string str ="服务继续运行";
        base.OnContinue();
       }
       protected override void OnPause()
       {
        string str ="服务暂停";
        base.OnPause();
       }
      }
     }

    4.建立服务的“安装程序”
    4.1 双击”Service1.cs“,打开 Service1.cs 的视图设计器
    4.2 在视图设计器中任意位置右键,选择”添加安装程序“  
    4.3 这时项目跟目下将出现一个 ProjectInstaller.cs 的组件
        (如果是第一次添加”安装程序“的话)
    4.4 双击 ProjectInstaller.cs 打开 ProjectInstaller  的视图设计器
    4.5 找到 serviceInstaller1 组件,选中后按 F4 键,设置组件属性。
      Description=“测试服务1”;
      DisplayName=“Service1”;
      ServiceName=“Service1”;//这个值必须和 WindowsService1.InitService() 方法下设置的 base.ServiceName 属性一至。
      StartType 为服务运行类型,根据你的需要设置即可。(Manual:手动启动,AutoMatic 为自动启动)
    4.6 找到 serviceProcessInstaller1 组件,选中后按 F4 键,设置组件属性。
      Account=“LocalSystem”; //设置为其他的属性在开启服务时,会提示输入用户名和密码
    4.7 这样就完成了一个服务的所有准备,下面就是安装和测试工作。

    5.生成组件
     右键项目,选择“生成”。

    6.安装组件
    6.1 使用 InstallUtil.exe 工具注册组件服务,文件位置在不同版本的 framework 中。我用的是 4.0 所以在一下位置
     C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe
    6.2 打开生成目录,如果生成成功会有一个 WindowsService1.exe 文件
    6.3 在生成目录根目录下新加两个 bat(批处理文件),用于安装和卸载服务
      新建一个文本文件,打开文件加入以下两行命令
      C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe WindowsService1.exe
      pause
      保存后关闭文本文件,之后将其重命名为“安装服务.bat”文件,注意要修改后缀名为 .bat!

      再新建一个文本文件,打开文件加入以下两行命令
      C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe /u WindowsService1.exe
      pause
      保存后关闭文本文件,之后将其重命名为“卸载服务.bat”文件,注意要修改后缀名为 .bat!
    6.4 “安装服务.bat”文件,安装windows 服务

    7.安装成功后需要手动开启服务,因为我们刚设置 serviceInstaller1.StartType 为 Manual
     打开windows 服务管理器,找到名为 Service1 的服务,右键属性。点击【启动】按钮

    8.windows 调试
    8.1 回到开发环境,选择调试->附加到进程,勾选”显示所有用户进程“
    8.2 找到 WindowsService1.exe 进程(如果没有点击下刷新按钮),选中后点击“附加到进程”按钮。
    8.3 选中 Service1.cs 文件,后按 F7 打开代码视图
    8.4 在所有 str 变量上添加调试断点
    8.5 回到windows服务管理器,找 Service1 服务并选中它,在左侧有一个“暂停”按钮。点击一下
      这时,OnPause 方法下的断点命中!OK 达到了调试的目的了

    9.如果想一次安装多个服务,需要按照 2~5 的步骤多添加几个服务就好了!
     
    --------------------------------------------------------------------------------------
    问题及解决方案
    注册成功后,启动 Windows服务 时遇到错误:1083 的解决办法
    1.查看 Main() 方法中是否启动了指定的服务
     ServiceBase[] ServicesToRun;
     ServicesToRun = new ServiceBase[] 
     { 
      new Service1(),
      new Service2() //如果建立多个服务需要添加这段代码
     };
     ServiceBase.Run(ServicesToRun);

    2.确保 ProjectInstaller.cs 视图设计器中的 serviceInstaller1 组件的 ServiceName 属性
      与 Service1.cs 组件的 ServiceName 属性一致

    -----------------------------------------------------------------------------------------

    添加服务安装成功后自启动功能

    1.打开 ProjectInstaller.cs 视图设计器,选中  serviceInstaller1 组件

    2.打开 serviceInstaller1 组件的事件窗口,双击 AfterInstall 事件

    3.在 serviceInstaller1_AfterInstall 事件方法下添加如下代码

          System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController();
          sc.ServiceName = "ExpressDispatchingTrack"; //必须与 ProjectInstaller.cs 视图设计器中的 serviceInstaller1 组件的 ServiceName 属性
    一致
          sc.Start();

     原文地址:http://write.blog.csdn.net/postedit/7542654

  • 相关阅读:
    thrift 依赖的库
    环球雅思名师公益大讲堂课表2.182.23 雅思资讯 环球雅思
    经验分享band 7.5已经工作的人如何准备雅思考试学习心得雅思频道|太傻网考试频道|常识 辅导 技巧 机经 名师 访谈 交流 资料 试题库
    Chapter 14. Boost.PropertyTree
    少讨论概念,少争论特征、少议论模型;多写代码、多做测试、多做应用。
    澳洲技术移民申请流程
    neo4j——图数据库初探 JDream314的专栏 博客频道 CSDN.NET
    Australia Immigration Network
    boost::property_tree
    海外澳洲技术移民花费一览表(2006年11月完整版) Topboy 博客园
  • 原文地址:https://www.cnblogs.com/xuemykisskui/p/4193748.html
Copyright © 2020-2023  润新知