在重写Service的onStart方法后,发现onStart方法中的代码并未执行,有木有人知道是怎么回事?

解决方案 »

  1.   

    关于调试windows service, 其实这是一个老生常谈的问题了.    通常的处理办法是, 在service运行后, 在调试器中选择attach to process.    然而这种做法也有一定的局限性, 例如在service启动时的OnStart事件中的代码, 基本上很难调试. 往往当attach到我们的service的时候, 这部分代码已经执行过了. 于是, 有人提出, 可以另写一个project来调用这个OnStart方法, 或将OnStart方法中的代码搬到另一个project中测试. 不过, 这些方法终究不是以windows服务的方式调试的, 不能够最真实的反应service运行时的执行状况(如权限问题等环境问题).    我的做法是, 在OnStart方法的最开始部分加上"Debugger.Launch()"的调用, 当service运行到此处时, 将会弹出一个选择调试器的对话框, 同时暂停在当前位置. 这样, 我们就做到了在代码中手动的启动调试器.    示例代码如下:using System.Diagnostics;
     
    public partial class MyService : ServiceBase{
    public MyService(){
    InitializeComponent();
    }
     
    protected override void OnStart(string[] args){
    #if DEBUG
    Debugger.Launch();    //Launches and attaches a debugger to the process.
    #endif
    // TODO: add your initialize code here.
    }
     
    protected override void OnStop(){
    }
    }
    调试WindowsService的OnStart函数是比较困难的也比较让人头疼的事情,用attach process的方法是不能调试OnStart函数的,在挂载时就已经执行过了。我在网上看了一些方法都是比较麻烦的,有的说是写一个console程序将OnStart函数里的代码先在console程序里调试通了再放到service中,感觉这个方法工作量太大了,^_^我是比较懒的,后来在网上看到一个很简单的方法是这样的virtual void OnStart(String* args[]){Debugger::Launch();//TODO: Add code here to start your service.}我试了这个方法后,发现还是不行,我查了msdn说Debugger::Launch()是发动和挂载到相应的进程中,他并没有breadkpoint的功能,我就想啊,要是能动态的加一个breakpoint那问题不是就解决了吗?virtual void OnStart(String* args[]){Debugger::Launch();Debugger::Launch();//TODO: Add code here to start your service.这样就可以跳到这里来调试了}可是我们在程序中设置断点后在运行exe文件时是不会break的。既然Debugger有挂载的功能会不会也有动态设置断点的功能呢,^_^,去msdn看了下它的成员函数果然有一个方法Debugger::Break()可以动态设置断点,问题就轻松解决了。^_^。既然Debugger::Break();可以动态设置断点那么在调试windowsService的其他函数中也可以用到,那调试windowsService程序不是和调试winform程序一样简单了吗?^_^  virtual void OnStart(String* args[])中的参数,是在启动服务时可以传入的。例如:>cmd sc start servicename args[0] args[1] .........
      

  2.   

    service有两种启动方式还可以onbind,话说onstart好像已经被废弃了,换成onstartcommand了
      

  3.   

    onStart方法只在service没启动的时候调用一次,如果service已经启动那不会调用onstart的