与通过Windows服务控制管理器启动服务然后将调试器附加到线程相比,是否有更简单的方法来单步执行代码?这有点麻烦,我想知道是否有更直接的方法。
发布于 2012-06-01 01:12:44
几周前,当我建立一个新的服务项目时,我发现了这篇文章。虽然有很多很棒的建议,但我仍然没有找到我想要的解决方案:调用服务类的OnStart
和OnStop
方法而不对服务类进行任何修改的可能性。
我提出的解决方案使用Environment.Interactive
选择运行模式,正如本文的其他答案所建议的那样。
static void Main()
{
ServiceBase[] servicesToRun;
servicesToRun = new ServiceBase[]
{
new MyService()
};
if (Environment.UserInteractive)
{
RunInteractive(servicesToRun);
}
else
{
ServiceBase.Run(servicesToRun);
}
}
RunInteractive
帮助器使用反射调用受保护的OnStart
和OnStop
方法:
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。
发布于 2008-09-24 08:14:07
我通常做的是将服务的逻辑封装在一个单独的类中,并从一个“runner”类开始。这个运行器类可以是实际的服务,也可以只是一个控制台应用程序。所以你的解决方案至少有3个项目:
/ConsoleRunner
/....
/ServiceRunner
/....
/ApplicationLogic
/....
发布于 2008-09-24 08:13:20
您还可以通过命令提示符(sc.exe)启动服务。
就我个人而言,我会在调试阶段将代码作为一个独立的程序运行,当大多数错误被解决后,就改为作为服务运行。
https://stackoverflow.com/questions/125964
复制相似问题