is there a uniform way in .NET to get application path (physical) both for windows applications and asp.net applications ??
- By uniform, do you mean "single method or similar in the existing .NET runtime that will give you the answer" or do you mean "Can someone give me a piece of code in the form of a method that will always produce the right path regardless of context?"Lasse V. Karlsen– Lasse V. Karlsen2009-11-11 09:53:47 +00:00Commented Nov 11, 2009 at 9:53
- yes, you pointed it out, i mean single method or property. i don't want to code something to find out which context i'm in.ali takavci– ali takavci2009-11-11 12:47:07 +00:00Commented Nov 11, 2009 at 12:47
4 Answers
I don't know if it gives exactly what you are looking for, but AppDomain.CurrentDomain.BaseDirectory could be a candidate.
Update
As @AZ pointed out, there are cases when this will not return what you would typically consider the "application directory", so in the end I would say that no, there is no uniform way that will securely give you what you expect.
3 Comments
BaseDirectory.[Assuming you mean the bin\ folder] This is how I do it.
If your environment is typically Windows apps and Asp.Net, then you should:
- Check to see if
AppDomain.CurrentDomain.SetupInformation.PrivateBinPathis not empty or null.- If not, then check to see if it is rooted or not
- If not, then remember this value as
BinPath(it'll be 'bin\' in Asp.Net) - but beware that more custom AppDomain hosting environments might have more than one path here and could have a rooted path.
- If not, then remember this value as
- If not, then check to see if it is rooted or not
Then, either
- It's
AppDomain.CurrentDomain.BaseDirectory - Or
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, BinPath)(whereBinPathis remembered from earlier).
There are some other advanced scenarios with this - Test Runners hosting a temporary domain for unit tests, and other strange things. Asp.Net also has it's dynamic folder which has been mentioned elsewhere on this answer - but that's a red-herring if you're just looking to get at the bin folder reliably.
You certainly can't just use the Entry Assembly's path - because in an Asp.Net site that will be dynamically generated and will reside in that dynamic folder.
Equally - there are things like Sql Server-hosted domains to consider, which changes the ballgame again (in this case you'd get the MSSQL Server folder).
So any solution that can reliably determine this for any AppDomain is actually going to be best produced by trial and error I'm afriad - until somebody comes up with a complete answer for every hosting scenario! So stick with your most common ones.
Comments
Assembly.GetExecutingAssembly().Location. It always gets you the path of the executing dll or exe (will be in bin folder for web apps) then you can deduce the app directory from it
3 Comments
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\[...]\theassemblycontainingyourfile.dll, which may not be what you look for. I really think that the answer to the original question is "no there is uniform way"; my answer also contains flaws (as you rightfully pointed out).I had the same question because I am writing a framework component that runs in unit test assemblies as well as ASP.NET web sites.
I did not test all combinations, but I did test the following code under IIS Express 7.5 and in Visual Studio while running unit tests using the CodeRush plug-in, and it worked fine.
I'll give credit to an old section of the MSDN documentation for putting me on this path: http://msdn.microsoft.com/en-us/library/aa457089.aspx#howtoexecutingapppath_topic3
Anyway, this is the code. Hope it helps:
string binPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); string appPath = binPath.Substring(0, binPath.LastIndexOf("bin", StringComparison.InvariantCultureIgnoreCase));