Подтвердить что ты не робот

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

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

string root = Application.StartupPath;

Или

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

И после этого

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

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

4b9b3361

Ответ 1

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

Однако:

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

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

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

Ответ 2

Это зависит. Если вы хотите, чтобы каталог 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;
}

Ответ 3

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

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

Ответ 4

Я использую

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

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

Ответ 5

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

string path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName