空参考例外

时间:2011-03-10 23:03:02

标签: c# windows windows-services

感到沮丧一直在寻找这一天...我正在创建一个Windows服务...这个代码在常规控制台应用程序上工作正常,并且无法在Windows服务上运行。我得到一个空引用异常:

Null reference in OnStart(): Object reference not set to an instance of an object. 
 at VNurseService.Server.RequestServer..ctor(Server s)
 at VNurseService.VNurseServer.OnStart(String[] args)

代码如下:

protected override void OnStart(string[] args)
    {

        eventLog1.WriteEntry("In OnStart");
       Start:
        try
        {
            server = new Server();

            Server.RequestServer reference = new Server.RequestServer(server);
            new Thread(reference.run).Start();
            //r1 = new Thread(reference.run); r1.Start();

            Server.ResponseServer reference2 = new Server.ResponseServer(server);
            new Thread(reference2.run).Start();
            //r2 = new Thread(reference.run); r2.Start();

            Server.reference3 = new Server.ConfirmationServer(server);

            server.guiServer = new Guicom();
            server.restartServer = new Restart();

            eventLog1.WriteEntry("Restart in server is " + server.RESTART.ToString());

            new Thread(server.guiServer.accept).Start();
            new Thread(server.restartServer.accept).Start();
            goto check;

        check:
            while (true)
            {
                eventLog1.WriteEntry("CheckRestart is " + server.checkRestart().ToString());
                if (server.checkRestart())
                {
                    reference.cleanup();
                    //r1.Abort();
                    reference2.cleanup();
                    //r2.Abort();
                    //server = null;
                    goto Start;
                }
            }
        }
        catch (NullReferenceException ex)
        {
            eventLog1.WriteEntry("Null reference in OnStart(): " + ex.Message+ " " + ex.InnerException + @"\n " + ex.StackTrace);
        }
    }

有些东西给了我一个空引用异常,我不知道它在哪里。

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

您可以在服务启动时在代码中添加强制断点...

protected override void OnStart(string[] args)     
{   
    System.Diagnostics.Debugger.Break();       

    eventLog1.WriteEntry("In OnStart"); 
    ...
}

..并将调试器附加到进程

答案 1 :(得分:1)

 eventLog1.WriteEntry("Null reference in OnStart(): " + ...);

我认为你是自己信息的受害者。 OnStart中实际上没有发生异常,即使您的消息说它确实发生了。它在RequestServer类中被轰炸,你没有发布的代码。请注意调用堆栈如何为您提供正确的信息。列出的.ctor()是类的构造函数,就是那个被轰炸的构造函数。

看看它。并修复WriteEntry()参数,我建议像“启动失败”。

答案 2 :(得分:0)

更好的是,启动一个调试器:

protected override void OnStart( string [] args )
{
    if ( args.Contains( "debug" ) ) System.Diagnostics.Debugger.Launch();
}

在services.msc中,您可以通过右键单击(已停止)服务“属性/常规/启动参数”来添加要在启动时传递的参数