Currently I’m checking it in the following way:
if (Environment.UserInteractive)
Application.Run(new ServiceControllerForm(service));
else
ServiceBase.Run(windowsService);
It helps debugging a little and service can also be run using the executable. But assume now that the service requires interaction with the user desktop so that I have to enable “Allow service to interact with desktop” in the properties. This of course breaks this way of checking. Is there another way?
It’s not perfect, but you could probably do something like this:
The idea is that if you run this while your service is still starting up then it will always be in the pending state. If the service isn’t installed at all then the method will always return false. It will only fail in the very unlikely corner case that the service is starting and somebody is trying to start it as an application at the same time.
I don’t love this answer but I think it is probably the best you can do. Realistically it’s not a very good idea to allow the same application to run in either service or application mode – in the long run it will be easier if you abstract all of the common functionality into a class library and just create a separate service app. But if for some reason you really really need to have your cake and eat it too, you could probably combine the
IsServicemethod above withEnvironment.UserInteractiveto get the correct answer almost all of the time.