views:

518

answers:

3

Is there any way to know in C# the type of application that is running.

Windows Service ASP.NET Windows Form Console

I would like to react to the application type but cannot find a way to determine it.

+2  A: 

Try checking Application.MessageLoop. It should be true for Windows Forms applications (that have a WinForms message loop), and false for windows services. I don't know what it would return for ASP.NET.

As for console applications, they would have no message loop so they would return false. You can check for that using most properties in the Console class, but I warn you that it's a HACK. If you must, I'd go with:

bool isConsole = Console.In != StreamReader.Null;

Note, that a console app could still call Console.SetIn(StreamReader.Null) or a windows app could call Console.SetIn(something else), so this is easily tricked.

configurator
+1  A: 

ASP.NET, check the if HttpContext.Current is null

codemeit
+2  A: 

You should have the client code tell your code what the context is and then work from that. At best, you will be able to guess based on external factors.

If you must guess, this is what I would look for:

  • For ASP.NET, I would look for HttpContext.Current
  • For Windows Forms, I see if the static OpenForms collection on the Application class has any items in it.
  • For Windows Presentation Foundation, see if the static Current property on the Application class is not null.
  • For a service, there really is no way to determine this, since services do not have to register process handles, thread handles, or the like.
  • For console windows, if none of the above is true, then I would assume this is a console.
casperOne
Re detecting a service, one heuristic might be to see if System.ServiceProcess.dll is loaded in the AppDomain. Few non-service processes would load this assembly. It's not 100% reliable, I admit; in particular it will not detect unmanaged services loading the DLL via COM or the CLR hosting APIs.
itowlson