Каков наилучший способ определения корневого каталога приложения? - PullRequest
48 голосов
/ 12 декабря 2008

Мне нужно получить все dll в корневом каталоге моего приложения. Каков наилучший способ сделать это?

string root = Application.StartupPath;

Или,

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

И после этого

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

Какой способ лучше? Есть ли лучшие способы?

Ответы [ 5 ]

68 голосов
/ 12 декабря 2008

AppDomain.CurrentDomain.BaseDirectory мой путь к этому.

Тем не менее:

Application.StartupPath получает каталог вашего исполняемого файла

AppDomain.BaseDirectory получает каталог, используемый для разрешения сборок

Поскольку они могут быть разными, возможно, вы захотите использовать Application.StartupPath, если вам не нужно разрешение сборки.

20 голосов
/ 12 декабря 2008

Это зависит. Если вы хотите каталог 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;
}
7 голосов
/ 02 сентября 2014

Это старый вопрос, но я всегда использовал:

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

Однако, глядя на решения здесь, я думаю, что нужно сделать несколько простых тестов:

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 - это путь.

1 голос
/ 05 августа 2013

Если вы хотите получить путь к корневой папке приложения, используйте приведенный ниже пример кода.

string path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName
0 голосов
/ 22 августа 2017

Я использую

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

Assembly.Location будет указывать на теневую копию, если вы используете теневое копирование, поэтому лучше использовать CodeBase, но CodeBase - это URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...