使用Assembly vs AppDomain查找我的主要可执行文件的路径

我是.NET用户,我的目标就像寻找我主要执行程序集(EXE文件)的目录的绝对路径一样简单。

我有几个候选人:

  • Assembly.GetExecutingAssembly().CodeBase
  • Assembly.GetExecutingAssembly().Location
  • AppDomain.CurrentDomain.BaseDirectory
  • 如果要通过.NET文档进行判断 - 我倾向于CodeBase 。 任何人都可以比.NET文档更具体地阐述所有三种方法吗? 一个例子来证明这种差异?


    我会使用GetEntryAssembly()而不是GetExecutingAssembly()

    要明白为什么,请这样做:

  • 创建一个新的控制台项目
  • 将一个类库项目( ClassLibrary1 )添加到该解决方案并从控制台项目中引用它。
  • 把它放在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));
            }
        }
    }
    

    把它放在控制台的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:tempClassLibrary1.dll");
                Type t = asm.GetType("ClassLibrary1.Class1");
                object obj2 = asm.CreateInstance("ClassLibrary1.Class1");
                t.GetMethod("GetInfo").Invoke(obj2, new object[] { 3 });
    
                Console.ReadKey();
            }
        }
    }
    

    构建解决方案,将ClassLibrary1.dll复制到c:temp并运行。

    正如你将看到的, GetExecutingAssembly()可能在某些情况下欺骗你。

    最后一点,如果你的应用程序是Windows窗体,你可以使用Application.ExecutablePath


    我不确定AppDomain.CurrentDomain.BaseDirectory ,但是Assembly.GetExecutingAssembly().CodeBaseAssembly.GetExecutingAssembly().Location之间的区别在本博客文章中有解释。

    CodeBase是找到文件的地址的URL,而Location是实际加载的路径。 例如,如果程序集是从互联网下载的,它的CodeBase可能以“http://”开头,但其位置可能以“C:”开头。 如果该文件被阴影复制,则该位置将成为影子副本目录中文件副本的路径。

    我们也很高兴知道CodeBase不能保证在GAC中为程序集设置。 但是,位置将始终为从磁盘加载的程序集设置。

    所以看起来你最好的选择是Location如果你需要真正的目录文件执行。


    不幸的是,如果您使用XenoCode后构建等虚拟化技术,上述所有方法都可能失败。 我测试了很多方法,并在这里找到了另一个解 我发现只有这个

    System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"
    

    返回可执行文件的正确文件名。 因此,将文件名与Assembly.GetEntryAssembly().Location路径相结合,您将获得可执行文件的正确路径。

    链接地址: http://www.djcxy.com/p/21097.html

    上一篇: Finding my main executable's path using Assembly vs AppDomain

    下一篇: file in .NET