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.