What is the best way to determine application root directory?

C#.NetWinforms

C# Problem Overview


I need to get all dlls in my application root directory. What is the best way to do that?

string root = Application.StartupPath;

Or,

string root = new FileInfo(Assembly.GetExecutingAssembly().Location).FullName;

And after that,

Directory.GetFiles(root, "*.dll");

Which way is better? Are there better ways?

C# Solutions


Solution 1 - C#

AppDomain.CurrentDomain.BaseDirectory is my go to way of doing so.

However:

Application.StartupPath gets the directory of your executable

AppDomain.BaseDirectory gets the directory used to resolve assemblies

Since they can be different, perhaps you want to use Application.StartupPath, unless you care about assembly resolution.

Solution 2 - C#

It depends. If you want the directory of the EXE that started the application, then either of your two examples will work. Remember though, that .NET is very flexible, and it could be that another application has linked to your EXE and is calling it, possibly from another directory.

That doesn't happen very often and you would probably have written if it did, but it is a possibility. Because of that, I prefer to specify which assembly I am interested in and get the directory from that. Then I know that I am getting all of the DLLs in the same directory as that specific assembly. For example, if you have an application MyApp.exe with a class in it MyApp.MyClass, then you would do this;

string root = string.Empty;
Assembly ass = Assembly.GetAssembly( typeof( MyApp.MyClass ) );
if ( ass != null )
{
   root = ass.Location;
}

Solution 3 - C#

This is an old question but I always used to use:

Environment.CurrentDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);

However, looking at the solutions in here I think some simple tests need to be done:

var r = new List<long>();
var s = Stopwatch.StartNew();

s.Restart();
string root1 = Application.StartupPath;
r.Add(s.ElapsedTicks);

s.Restart();
string root2 = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
r.Add(s.ElapsedTicks);

s.Restart();
string root3 = Path.GetDirectoryName(new FileInfo(Assembly.GetExecutingAssembly().Location).FullName);
r.Add(s.ElapsedTicks);

s.Restart();
string root4 = AppDomain.CurrentDomain.BaseDirectory;
r.Add(s.ElapsedTicks);

s.Restart();
string root5 = Path.GetDirectoryName(Assembly.GetAssembly( typeof( Form1 ) ).Location);
r.Add(s.ElapsedTicks);

The results in ticks:

  • 49
  • 306
  • 166
  • 26
  • 201

So it seems AppDomain.CurrentDomain.BaseDirectory is the way to go.

Solution 4 - C#

If you want to get the application root folder path use below code sample.

string path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName

Solution 5 - C#

I use

Path.GetDirectoryName(new Uri(Assembly.GetEntryAssembly().CodeBase).LocalPath)

The Assembly.Location will point to the shadow copy if you use shadow copying, so using CodeBase is a better option, but CodeBase is a Url.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionabatishchevView Question on Stackoverflow
Solution 1 - C#Greg DeanView Answer on Stackoverflow
Solution 2 - C#Rob ProuseView Answer on Stackoverflow
Solution 3 - C#eriedView Answer on Stackoverflow
Solution 4 - C#Telan NirangaView Answer on Stackoverflow
Solution 5 - C#SomeguyView Answer on Stackoverflow