I have a C#/.NET program that can run both as a console application and as a service. Currently I give it a command-line option to start as a console application, but I would like to avoid that.
Is it possible to programmatically detect whether my program is being started as a service?
If it was pure Win32, I could try starting as a service with StartServiceCtrlDispatcher and fall back to console if it returned ERROR_FAILED_SERVICE_CONTROLLER_CONNECT, but System.ServiceProcess.ServiceBase.Run() pops up an errordialog if it fails and then just returns without signaling an error to the program.
Any ideas?
-
I haven't tried it, but it's possible that Process.GetCurrentProcess will help - under console mode the process name would be the same as the executable, whereas I'd expect (and again, please check!) that when running as a service it would be different.
Marc Gravell : I thought that the process was still (usually) the same exe itself, unless you go out of your way to rehost via svchost.exe or similar...Jon Skeet : Could be - hard to test from my current desk :(Arne Claassen : At least under mono, the process name does change to the executing entity (i.e. if run with mono-service the process is now called mono-service). Haven't tried as a windows serviceFrom Jon Skeet -
Rasmus, this is the earlier question.
From the answers it seems the most popular way is to use a simple command line option, or try accessing the Console object in a try catch block (in a Service the Console is not attached to the process and trying to access it throws an exception).
Or if you're having trouble testing/debugging the service, move code into a separate dll assembly and create a seprate test harness (winforms/console etc).
(Just noticed that Jonathan has added his solution to the end of the question.)
From Ash -
Environment.UserInteractive will do the magic.
taspeotis : What if the service is running on Windows XP with "Allow this service to interact with the desktop" set?Ishmaeel : It will stop doing magic, that's what :)From Vlad Nagorny -
I don't know if this will work, but you may want to try using PInvoke with this code and checking if the parent is "services.exe".
From taspeotis
0 comments:
Post a Comment