Link to home
Start Free TrialLog in
Avatar of rye004
rye004Flag for United States of America

asked on

Can a C# Class Determine if it is being called from a Console, Service or Windows Form?

I have a static class that I have created in C#.  I have been testing my static Class using a console application.  Now that my testing is done, I am going to integrate this to a Windows Service.

Is it possible to determine from within the static Class if it is being called from a Console, Service or a Windows Form application?  Depending on the type of application it is being used in, there are some functions that I would want to preform differently.

Many Thanks!
Avatar of Korbus
Korbus

I dont think so.  I suspect you will need to add a parameter to your class constructor to tell it how to operate. (In fact, I would recommend this anyway, so users of the class have more control.)

But again, I'm not sure, lets see what other experts say.
Why you probably shouldn't

I agree with Korbus. If you detect inside your code you tightly couple it to the user interface which is a bad dependency. It's better to invert control and have the calling application configure your class as required.

The fact that you're trying to detect the calling code also suggests you're doing something in your C# class that should in fact be in your user interface code.

It will also make testing harder since you can't isolate your class properly in your unit tests.

If you absolutely must

If you desperately want to do this any way I know in our one of our apps we have a horrible dependency in our business layer to that grabs System.Web.HttpContext.Current.Response - I believe this is null when it's not run from a web app. There are probably similar environment variables specific to winforms and console apps you could test.

You could also perhaps try running the command line app with a flag and checking Environment.GetCommandLineArgs(), or check the process name System.Diagnostics.Process.GetCurrentProcess().ProcessName.
Be aware that a service does not behave the same way as a "standard" dll.

It is a stateless object, it does not retain values between calls. Each time you call a method in the service, it is a one shot deal. So stuff such as Shared variables won't retain their values between calls.

As far as I know, the only way you can do what you want in a service is either to have different methods for different functions, or pass a parameter to the methods that specifies the type of the caller.
Avatar of rye004

ASKER

Thank you everyone for your input.
I wanted to give everyone a little more detail.  My class was designed to run as a service or console application.  It is designed to be lightweight and run on multiple machines.  The application gets called from using Remoting. Basically, I have a master application that calls the machines.  The master application does not care if it runs in a service or console.
My main reason for asking this, is showing output differs from a service or a command line running the application.
I have an XML file that the Master application uses to see which machines are running the class.  From my reading, it looks like I should add an option to my XML file to indicate if the class is running as a service or a console application.
XML config sounds like a reasonable solution. Avoids the coupling issue.
ASKER CERTIFIED SOLUTION
Avatar of Snarf0001
Snarf0001
Flag of Canada image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of rye004

ASKER

This is great thank you.  I ended up passing a value to determine this, but will try this in the future.