使用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().CodeBase
和Assembly.GetExecutingAssembly().Location
之间的区别在本博客文章中有解释。
CodeBase是找到文件的地址的URL,而Location是实际加载的路径。 例如,如果程序集是从互联网下载的,它的CodeBase可能以“http://”开头,但其位置可能以“C:”开头。 如果该文件被阴影复制,则该位置将成为影子副本目录中文件副本的路径。
我们也很高兴知道CodeBase不能保证在GAC中为程序集设置。 但是,位置将始终为从磁盘加载的程序集设置。
所以看起来你最好的选择是Location
如果你需要真正的目录文件执行。
不幸的是,如果您使用XenoCode后构建等虚拟化技术,上述所有方法都可能失败。 我测试了很多方法,并在这里找到了另一个解 我发现只有这个
System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"
返回可执行文件的正确文件名。 因此,将文件名与Assembly.GetEntryAssembly().Location
路径相结合,您将获得可执行文件的正确路径。
上一篇: Finding my main executable's path using Assembly vs AppDomain
下一篇: file in .NET