OneTrueError - Automated exception handling

An easier way to debug windows services

Have you got tired of attaching the Visual Studio debugger to the service application? I got the solution just for you! It’s a small helper class containing a static method which you need to invoke.

public static void Main(string[] argv)
{
    // just include this check, "Service1" is the name of your service class.
    if (WindowsServiceHelper.RunAsConsoleIfRequested<Service1>())
        return;

    // all other code 
}

Then go to project properties, the “Debug” tab and add “-console” as Command Arguments.

Shows the debug settings under project properties

How to configure Visual Studio

That’s it. What I do is simply to allocate a console using the winapi and then invoke (through reflection) the proper protected methods in your service class.

Source code for the helper class:

public static class WindowsServiceHelper
{
    [DllImport("kernel32")]
    static extern bool AllocConsole();

    public static bool RunAsConsoleIfRequested<T>() where T : ServiceBase, new()
    {
        if (!Environment.CommandLine.Contains("-console"))
            return false;

        var args = Environment.GetCommandLineArgs().Where(name => name != "-console").ToArray();

        AllocConsole();

        var service = new T();
        var onstart = service.GetType().GetMethod("OnStart", BindingFlags.Instance | BindingFlags.NonPublic);
        onstart.Invoke(service, new object[] {args});

        Console.WriteLine("Your service named '" + service.GetType().FullName + "' is up and running.\r\nPress 'ENTER' to stop it.");
        Console.ReadLine();

        var onstop = service.GetType().GetMethod("OnStop", BindingFlags.Instance | BindingFlags.NonPublic);
        onstop.Invoke(service, null);
        return true;
    }
}
This entry was posted in CodeProject and tagged , . Bookmark the permalink.
  • http://twitter.com/jakescott Jake Scott

    Or you could just use TopShelf which makes it easy to run as a console app, then has a built in installer to be able to add it to the system as a service.

    Nice write up here
    http://mookid.dk/oncode/archives/2174

    • http://www.gauffin.com jgauffin

      TopShelf is great, but imho the helper class and TopShelf targets different audiences.

  • Viktor Elofsson

    This is great in so many ways. Thanks for sharing!