什么是确定应用程序根目录的最佳方式?

我需要在我的应用程序根目录中获取所有dll。 什么是最好的办法呢?

string root = Application.StartupPath; 

要么,

 string root = new FileInfo(Assembly.GetExecutingAssembly().Location).FullName; 

在那之后,

 Directory.GetFiles(root, "*.dll"); 

哪种方式更好? 有更好的方法吗?

5 Solutions collect form web for “什么是确定应用程序根目录的最佳方式?”

AppDomain.CurrentDomain.BaseDirectory是我去这样做。

然而:

Application.StartupPath获取可执行文件的目录

AppDomain.BaseDirectory获取用于parsing程序集的目录

由于它们可能不同,也许你想使用Application.StartupPath,除非你关心程序集parsing。

这取决于。 如果你想要启动应用程序的EXE的目录,那么你的两个例子中的任何一个都可以工作。 请记住,.NET是非常灵活的,可能是另一个应用程序已经链接到您的EXE,并正在调用它,可能从另一个目录。

这不经常发生,如果有的话,你可能会写,但这是一种可能性。 因此,我更喜欢指定我感兴趣的程序集并从中获取目录。 然后我知道我正在获取与特定程序集相同的目录中的所有DLL。 例如,如果您的应用程序MyApp.exe带有一个MyApp.MyClass类,那么您可以这样做;

 string root = string.Empty; Assembly ass = Assembly.GetAssembly( typeof( MyApp.MyClass ) ); if ( ass != null ) { root = ass.Location; } 

这是一个老问题,但我总是习惯使用:

 Environment.CurrentDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); 

但是,看看这里的解决scheme,我认为需要做一些简单的testing:

 var r = new List<long>(); var s = Stopwatch.StartNew(); s.Restart(); string root1 = Application.StartupPath; r.Add(s.ElapsedTicks); s.Restart(); string root2 = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); r.Add(s.ElapsedTicks); s.Restart(); string root3 = Path.GetDirectoryName(new FileInfo(Assembly.GetExecutingAssembly().Location).FullName); r.Add(s.ElapsedTicks); s.Restart(); string root4 = AppDomain.CurrentDomain.BaseDirectory; r.Add(s.ElapsedTicks); s.Restart(); string root5 = Path.GetDirectoryName(Assembly.GetAssembly( typeof( Form1 ) ).Location); r.Add(s.ElapsedTicks); 

结果在蜱中:

  • 49
  • 306
  • 166
  • 26
  • 201

所以看来AppDomain.CurrentDomain.BaseDirectory是要走的路。

我用

Path.GetDirectoryName(new Uri(Assembly.GetEntryAssembly().CodeBase).LocalPath)

如果使用阴影复制,Assembly.Location将指向阴影副本,因此使用CodeBase是更好的select,但CodeBase是Url。

如果您想获取应用程序根文件夹path,请使用下面的代码示例。

 string path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName 
  • 我如何禁用TabControl内的选项卡?
  • 如何设置TcpClient的超时时间?
  • 你如何防止窗户被移动?
  • Windows窗体中是否有内置确认对话框?
  • 如何使一个窗口始终保持在.Net的顶部?
  • 更新基础数据源时刷新DataGridView的最佳方法
  • 任务并行库replace为BackgroundWorker?
  • 在Windows窗体上绘制一个像素
  • 通过文本框循环
  • WPF vs Winforms的.Net新手
  • 上,下,左,右箭头键不会触发KeyDown事件