zoukankan      html  css  js  c++  java
  • 用VS(c#)创建、调试windows service以及部署卸载 Anny

    同事问到windows service的东东,现在整理一下,用c#如何创建一个windows service,以及如何调试、部署、卸载。

    一、创建windows service

    1. 打开VS2008,新建一个Project, Project类型选择Visual C#-Windows,在Templates中选择Windows Service, 其他可以默认,点击OK。

    2. 在Solution Explorer中会看到自动产生了三个文件:app.config, Program.cs,Service1.cs,其中app.config可以添加一些自定义的配置信息,供代码文件使用;Program.cs提供了Main()方法,作为程序的人口,一般不需要修改;Service1.cs就是要实现的服务。

    3. 双击打开Service1.cs,会默认打开Service1.cs[Design],在这个界面可以拖拽一个组件,此外,在Properties中,会看到一些关于这个service的属性设置,比如AutoLog(True:使用windows event log记录该service的日志;False:用户可以自定义自己的event Log),CanPauseAndContinue(True:可以处理暂停和继续该服务的操作;False:不可以处理暂停或者继续该服务的操作),ServiceName(用于让Service Control Manager识别的服务名称)。

    4. 转到Code视图,可以看到默认生成了一个构造函数,和两个需要重写的方法OnStart和OnStop,我们需要覆写这两个方法。下面是简单重写了OnStart方法。

       protected override void OnStart(string[] args)
       {
                string path = @"d:\share\test.txt";
                StreamWriter sw;
                sw = new StreamWriter(path);
                foreach (string arg in args) sw.WriteLine(arg);
                sw.Close();
                sw.Dispose();
       }
    这样最基本的一个windows service就搞定了,但是能否正常运行,我们需要调试一把。

    二、调试windows service

    通常,我们用的调试方法是需要把服务部署好,然后attach to process...,找到对应的服务进程,予以调试。但是操作比较繁琐,修改完服务后,需要卸载服务,然后重新部署,并且OnStart方法难以调试。从网络上找到一个好的调试方法,并尝试通过,很好用的,推荐给大家:)

    1. 在Service1.cs中添加public方法,将需要调试的protected方法进行封装,供Main()调用,以调试OnStart()为例:

      public void start(string[] args)
      {
                this.OnStart(args);
      }

    2. 在Main()中添加下面的代码,在人机交互时执行:

         if (Environment.UserInteractive)
                {
                    Service1 s = new Service1();
                    string[] args = { "a", "b" };
                    s.start(args);
                    Console.WriteLine("the service is started");
                    Console.ReadLine();
                    s.stop();
                    Console.WriteLine("the service is stopped");
                }
                else
                {
                    ServiceBase[] ServicesToRun;
                    ServicesToRun = new ServiceBase[] 
             { 
              new Service1() 
             };
                    ServiceBase.Run(ServicesToRun);
                }

    3. 更改Project的输出类型

    右击该Project,点击Properties,在Application标签中,更改Output Type为Console Application。

    好了,这样就可以按F5调试了:)

    三、部署

    1. 在Service1.cs的design视图中,右击鼠标,点击Add Installer,会自动创建一个ProjectInstall.cs文件,在design视图中,有两个组件serviceProcessInstaller1:这个组件的属性有一个叫Accout,默认是User,这样在部署的时候需要输入用户名和密码,这里我们可以选择权限最小的Localservice,当然要获得更多的权限可以设置其它两个network service和local

    serviceInstaller1:与服务本身相关的信息,比如服务名,服务描述,显示名称,启动类型等。

    2. 如果使用系统默认的event log,那么现在就可以编译然后部署了;如果使用了自定义的event log,则需要在ProjectInstaller中修改部分代码。

    3. 使用installutil.exe部署windows service

    (注意权限,这里需要用Administrator用户去部署,否则会提示一些错误信息:比如An exception occurred during the Install phase.
    System.Security.SecurityException: The source was not found, but some or all eve
    nt logs could not be searched.  Inaccessible logs: Security. 或者 access is denied)

    runas /user:Administrator cmd

    cd C:\Windows\Microsoft.NET\Framework\v2.0.50727

    installutil D:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe

    到此就部署完成了。

    四、卸载服务

    installutil /u D:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe

    五、启动服务

    1. 在启动服务时,有时候会出现服务启动后又停止的错误提示信息,指出该服务可能没有被使用,我们可以查看eventvwr,里面会给出足够的错误信息,根据错误信息调整service代码就可以了,也有可能是因为服务要操作文件,没有权限的原因,这时候把要操作的文件权限放开就可以了。

    2. 启动服务的时候,由于权限问题启动失败,我们可以设置启动的账号。

    3. windows service的参数是在启动时一次传递的,可以以界面形式传入参数,也可以通过命令行的形式:sc start service1 arg0 arg1 ...

    参考链接:

    http://nuigroup.com/forums/viewthread/9829/

    http://stackoverflow.com/questions/593454/easiest-language-to-create-a-windows-service/593803#593803

    http://topic.csdn.net/u/20090313/13/7c32b0e3-6e13-4226-8da4-392e31514454.html

    http://www.cnblogs.com/guoyinghai/archive/2008/04/16/1156943.html

  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/limei/p/1772332.html
Copyright © 2011-2022 走看看