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?

Original source

Related problems