在 Visual Studio 中创建一个服务项目无法直接启动,在调试器中。一个小的调整可以直接运行的服务和摆脱部署要测试它的服务的需要。
从第一次我试着早在很久以前我总是觉得他们难于调试的.NET 开发 c + + 中的 Windows 服务。当发展中国家想要我的环境设置多个启动项目,以便我可以打开一个解决方案,按 F5 并具有所需的一切运行。如果解决方案包含一个服务一个冗长乏味的编译安装开始服务-将调试器附加,则需要过程。
上周当创建了一个服务,我决定要找到一个更好的方法,使简单的"按 f5 键以得到一切运行"方法的方式。由于服务项目已编译为.exe 文件,它可以改变了要检查是否它运行作为一项服务,或以交互方式在启动过程中。如果以交互方式运行,反射黑客用于调用每个服务的OnStart方法。
第一步是更改服务的应用程序是一个控制台应用程序,而不是一个 windows 应用程序。你愿意使用 WinForms 或 WPF 的交互式 GUI,你应该把它作为它是,但这会使一个后台服务依赖于 UI 的图书馆,我不喜欢。此外,GUI 不是这个应用程序的重要组成部分。所以会做一个控制台应用程序的开发人员的目标。
第一Main功能有修改,以检查是否它运行以交互方式或作为一种服务。
static void Main()
{
ServiceBase[] servicesToRun;
servicesToRun = new ServiceBase[]
{
new MyService()
};
if (Environment.UserInteractive)
{
RunInteractive(servicesToRun);
}
else
{
ServiceBase.Run(servicesToRun);
}
}
做一次检查是为了Environment.UserInteractive交互模式和正常服务模式之间进行选择。这可能会导致在交互模式中运行的服务的问题。(还没有测试过也不打算 — — 因为以交互方式运行的服务通常是一个安全问题。如果你必须要与用户进行沟通,建立一个小的客户端应用程序,自动改为启动。)
真正的工作是在RunInteractive的帮助器方法。它要求每个服务的OnStart方法。然后它调用的每个服务的OnStop之前等待按键。保护的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);
}
建立这样的图书馆服务与它可以设置为启动时自动启动调试会话在 Visual Studio 中其他项目。使一切都开始于一个按钮 (F5) 真的加快了编码和调试。
原文:
Debugging a Windows Service Project
http://coding.abel.nu/2012/05/debugging-a-windows-service-project/