Finding my main executable's path using Assembly vs AppDomain

后端 未结 5 680
面向向阳花
面向向阳花 2020-12-09 03:21

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:

5条回答
  •  無奈伤痛
    2020-12-09 03:53

    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.

提交回复
热议问题