首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >调试Windows服务的更简单方法

调试Windows服务的更简单方法
EN

Stack Overflow用户
提问于 2008-09-24 08:08:37
回答 17查看 258K关注 0票数 342

与通过Windows服务控制管理器启动服务然后将调试器附加到线程相比,是否有更简单的方法来单步执行代码?这有点麻烦,我想知道是否有更直接的方法。

EN

回答 17

Stack Overflow用户

发布于 2012-06-01 01:12:44

几周前,当我建立一个新的服务项目时,我发现了这篇文章。虽然有很多很棒的建议,但我仍然没有找到我想要的解决方案:调用服务类的OnStartOnStop方法而不对服务类进行任何修改的可能性。

我提出的解决方案使用Environment.Interactive选择运行模式,正如本文的其他答案所建议的那样。

代码语言:javascript
复制
static void Main()
{
    ServiceBase[] servicesToRun;
    servicesToRun = new ServiceBase[] 
    {
        new MyService()
    };
    if (Environment.UserInteractive)
    {
        RunInteractive(servicesToRun);
    }
    else
    {
        ServiceBase.Run(servicesToRun);
    }
}

RunInteractive帮助器使用反射调用受保护的OnStartOnStop方法:

代码语言:javascript
复制
static void RunInteractive(ServiceBase[] servicesToRun)
{
    Console.WriteLine("Services running in interactive mode.");
    Console.WriteLine();

    MethodInfo onStartMethod = typeof(ServiceBase).GetMethod("OnStart", 
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Starting {0}...", service.ServiceName);
        onStartMethod.Invoke(service, new object[] { new string[] { } });
        Console.Write("Started");
    }

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine(
        "Press any key to stop the services and end the process...");
    Console.ReadKey();
    Console.WriteLine();

    MethodInfo onStopMethod = typeof(ServiceBase).GetMethod("OnStop", 
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Stopping {0}...", service.ServiceName);
        onStopMethod.Invoke(service, null);
        Console.WriteLine("Stopped");
    }

    Console.WriteLine("All services stopped.");
    // Keep the console alive for a second to allow the user to see the message.
    Thread.Sleep(1000);
}

这就是所需的全部代码,但我还编写了带有解释的walkthrough

票数 132
EN

Stack Overflow用户

发布于 2008-09-24 08:14:07

我通常做的是将服务的逻辑封装在一个单独的类中,并从一个“runner”类开始。这个运行器类可以是实际的服务,也可以只是一个控制台应用程序。所以你的解决方案至少有3个项目:

代码语言:javascript
复制
/ConsoleRunner
   /....
/ServiceRunner
   /....
/ApplicationLogic
   /....
票数 40
EN

Stack Overflow用户

发布于 2008-09-24 08:13:20

您还可以通过命令提示符(sc.exe)启动服务。

就我个人而言,我会在调试阶段将代码作为一个独立的程序运行,当大多数错误被解决后,就改为作为服务运行。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/125964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档