记录信息或调试Windows服务的最简单方法是什么?

时间:2013-12-17 15:21:56

标签: c# .net vb.net windows-services

我需要调试Windows服务,从Visual Studio我无法运行服务,因此我使用的是Installutil.exe。

所以在每次构建之后我都使用Installutil.exe,但我无法在我的代码中一步一步地进行。

你知道任何简单的方法:

  • 使用VS调试器检查代码?
  • 或在事件中记录一些消息,以便我可以追踪正在发生的事情?

由于

3 个答案:

答案 0 :(得分:3)

您可以使用Log4Net之类的记录器来写入文件,但如果您想调试,可以使用attach the debugger to a running process

答案 1 :(得分:1)

  

所以在每次构建之后我都使用Installutil.exe,但我无法继续前进   进入我的代码。

如果要在Visual Studio中调试服务,则可以执行以下操作。

Program.cs文件中定义:

private static void RunService()
{
    var service = new YourService();
    System.ServiceProcess.ServiceBase.Run(service);
}

//for debug only
private static void RunNoService()
{
    using (var service = new YourService())
    {
        service.Start();
        System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    }
}

Main方法

static void Main()
{
    if (Environment.UserInteractive) //This is IMPORTANT
        RunNoService();
    else
        RunService();
}

在您的服务中定义Start方法,该方法具有OnStart的功能,将您的OnStart方法修改为:

protected override void OnStart(string[] args)
{
    Start();
}

Environment.UserInteractive将检查是否正在从Visual Studio运行该服务并让您调试它。

用于记录:

始终在您的服务中记录您的活动。这将有助于您在生产中调试服务。您可以使用Log4Net,也可以创建自己的自定义类进行日志记录。即使记录到一个简单的文本文件也比没有任何东西更好。但是你必须保留日志,否则如果生产中出现问题,它可能会变得非常令人沮丧。

答案 2 :(得分:1)

要在Visual Studio中调试服务,我在服务项目中使用此代码:

Program.cs

    static class Program
    {
#if DEBUG
        static AutoResetEvent sare = new AutoResetEvent(false);
#endif

        static void Main()
        {
#if (!DEBUG)           
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] { new Service() };
            ServiceBase.Run(ServicesToRun);
#else
            Service service = new Service();
            service.DebugServiceStopped += new Action(SetAutoResetEvent);

            service.DebugStart();

            sare.WaitOne();
#endif
        }

#if DEBUG
        private static void SetAutoResetEvent()
        {
            sare.Set();
        }
#endif        
    }

Service.cs (实际Service类的文件)中,您需要添加以下代码部分:

#if DEBUG
        public event Action DebugServiceStopped;
        public void DebugStart()
        {
            OnStart(null);
        }
#endif

        protected override void OnStop()
        {
#if DEBUG
            DebugServiceStopped();
#endif
        }

如果在Visual Studio中选择Debug作为配置,您将能够像普通应用程序一样调试服务,否则项目将被编译为真实服务。

<强>日志记录: 在Windows上有 Windows事件日志,用于存储应用程序的信息,警告和错误。在服务中,事件日志可以写入:

EventLog.WriteEntry("your log message", EventLogEntryType.Information); // or EventLogEntryType.Error,... depending on the entry type