• 用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

  • 相关阅读:
    IP分类:A,B,C,D,E五类
    Makefile之“=”、":="、“+=”、“?=”
    Makefile之字符串函数
    Makefile之嵌套执行make
    vi中使用“/”查找字符
    Makefile学习之显示命令与出错命令
    【转】Unity中写GLSL(一)—— 简单的diffuse color
    关于编译GITHUB上的工程
    认识了一个新的手机游戏剖析工具- SnapDragon Profiler
    U3D资料收藏
  • 原文地址:https://www.cnblogs.com/limei/p/1772332.html
Copyright © 2020-2023  润新知