Finding my main executable's path using Assembly vs AppDomain
.net, directory, exe, path
Solution
I would use `GetEntryAssembly()` instead of `GetExecutingAssembly()`.
To see why, do this:
- Create a new Console Project
- Add a class library project (`ClassLibrary1`) to the solution and reference it from the Console Project.
Put this in `ClassLibrary1`:
namespace ClassLibrary1
{
using System;
using System.IO;
using System.Reflection;
public class Class1
{
public void GetInfo(int n)
{
Assembly asm = Assembly.GetEntryAssembly();
Console.WriteLine("[GetEntryAssembly {0}] Location:{1}", n, Path.GetDirectoryName(asm.Location));
asm = Assembly.GetExecutingAssembly();
Console.WriteLine("[GetExecutingAssembly() {0}] Location:{1}", n, Path.GetDirectoryName(asm.Location));
}
}
}
Put this in console's `Program.cs`:
namespace ConsoleApplication4
{
using System;
using System.IO;
using System.Reflection;
using ClassLibrary1;
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.GetEntryAssembly();
Console.WriteLine("[GetEntryAssembly() 1] Location:{0}", Path.GetDirectoryName(asm.Location));
asm = Assembly.GetExecutingAssembly();
Console.WriteLine("[GetExecutingAssembly() 1] Location:{0}", Path.GetDirectoryName(asm.Location));
Class1 obj1 = new Class1();
obj1.GetInfo(2);
asm = Assembly.LoadFile(@"C:\temp\ClassLibrary1.dll");
Type t = asm.GetType("ClassLibrary1.Class1");
object obj2 = asm.CreateInstance("ClassLibrary1.Class1");
t.GetMethod("GetInfo").Invoke(obj2, new object[] { 3 });
Console.ReadKey();
}
}
}
Build the solution, copy `ClassLibrary1.dll` to `c:\temp` and run.
As you will see, `GetExecutingAssembly()` may trick you in certain conditions.
One last note, if your app is a Windows Forms one, you can just use `Application.ExecutablePath`.
Problem
I'm a .NET user, and my goal is as simple as finding the absolute path of the directory of my main executing assembly (the EXE file). I have several candidates: - `Assembly.GetExecutingAssembly().CodeBase` - `Assembly.GetExecutingAssembly().Location` - `AppDomain.CurrentDomain.BaseDirectory` If to judge by the .NET documentation - I'm leaning towards `CodeBase`. Can anyone shed light over all three in a bit more specific terms than the .NET documentation? An example to demonstrate the difference perhaps?