views:

628

answers:

3

is there a uniform way in .NET to get application path (physical) both for windows applications and asp.net applications ??

+2  A: 

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.

Fredrik Mörk
Was just checking and it is indeed the one you need
Zenuka
if you are developing a windows service for example the property will return c:\windows\system32 because the service will be hosted by svchost.exe. So it does not work in all cases
AZ
@AZ: no, it's not a perfect solution. You could also have the case where the application runs inside an AppDomain that has been created in a way so that a directory other than where the application is loaded from is the `BaseDirectory`.
Fredrik Mörk
A: 

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

AZ
If you do that in an aspx-page running in IIS you get something like this: `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).
Fredrik Mörk
i started to think that too Fredrik, thanks guys..
@Fredrik - u'r right. I didn't test the case where you have a web site (dynamically compiled) and not an application. If it's possible change your project to Web Application and that will stop the temporary assembly generation that ASP does with web sites. Then it's consistent
AZ
A: 

[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.PrivateBinPath is 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.

Then, either

  • It's AppDomain.CurrentDomain.BaseDirectory
  • Or Path.Combine(AppDomain.CurrentDomain.BaseDirectory, BinPath) (where BinPath is 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.

Andras Zoltan