Run a WPF Application as a Windows Service
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.
Remy
Chief of the System at www.supertext.ch, the first copywriting and translation agency on the internet.
Updated on July 05, 2022Comments
-
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 almost 14 yearsThis is fine for the CLI and Service.
-
Remy almost 14 yearsI 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 almost 14 yearsThanks for the code. Have to dig a little deeper into the Services Stuff to understand the OnStop part.
-
Steven Sudit almost 14 years@Remy: A static reference loads the assembly in at the start.
-
Steven Sudit almost 14 yearsNot bad advice, but I find it's usually better to have the CLI run as a service by default. It simplifies setup.