Run a WPF Application as a Windows Service

23,447

Solution 1

As a rule of thumb services should never have any kind of UI. This is because services usually run with very high privileges and bad things can happen if you are not super careful with your inputs. (I think the newest versions of Windows won't let you create UI from a service at all but I am not 100% sure.)

If you need to communicate with a service, you should use some form of IPC (WCF, pipes, sockets, ...). If you want a simple console program that can also be a service, I know of a trick to set that up:

class MyExampleApp : ServiceBase
{
    public static void Main(string[] args)
    {
        if (args.Length == 1 && args[0].Equals("--console"))
        {
            new MyExampleApp().ConsoleRun();
        }
        else
        {
            ServiceBase.Run(new MyExampleApp());
        }
    }
    private void ConsoleRun()
    {
        Console.WriteLine(string.Format("{0}::starting...", GetType().FullName));

        OnStart(null);

        Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName));
        Console.ReadLine();

        OnStop();

        Console.WriteLine(string.Format("{0}::stopped", GetType().FullName));
    }
    //snip
}

If you just start the program, it will launch as a service (and yell at you if you run it from the console), but if you add the paramter --console when you start it, the program will launch and wait for you to hit enter to close.

Solution 2

We actually worked it out and wrote a little post about it:
http://remy.supertext.ch/2011/11/a-wpf-project-running-from-the-cmd-prompt-or-as-a-service-and-has-a-gui/

Maybe it helps someone.

Solution 3

Don't do this. Write all the guts in an engine assembly, then reference it from the GUI and the service. The CLI can either be a third executable, or a reuse of the service executable. The key is to allow the service to run without any references to WPF or WinForms or whatever GUI framework you use.

Share:
23,447
Remy
Author by

Remy

Chief of the System at www.supertext.ch, the first copywriting and translation agency on the internet.

Updated on July 05, 2022

Comments

  • Remy
    Remy almost 2 years

    We are developing a Windows Presentation Foundation Application that we would like to be able run as a Windows Service.

    Anyone done something like that?
    Is it possible?

    We don't need to interact with the Desktop or any GUI, it would just be nice to have one App that we can run with a GUI, from the Command Line (that works) or as a Service.

    Looking forward to interesting input :-)

  • Steven Sudit
    Steven Sudit almost 14 years
    This is fine for the CLI and Service.
  • Remy
    Remy almost 14 years
    I was thinking about this too. Sounds like a resonable solution. But why is a reference to WPF or WinForms bad? As long as it is just a reference?
  • Remy
    Remy almost 14 years
    Thanks for the code. Have to dig a little deeper into the Services Stuff to understand the OnStop part.
  • Steven Sudit
    Steven Sudit almost 14 years
    @Remy: A static reference loads the assembly in at the start.
  • Steven Sudit
    Steven Sudit almost 14 years
    Not bad advice, but I find it's usually better to have the CLI run as a service by default. It simplifies setup.