Каков наилучший способ определить корневой каталог приложения?
Мне нужно получить все DLL в корневом каталоге приложения. Каков наилучший способ сделать это?
string root = Application.StartupPath;
Или
string root = new FileInfo(Assembly.GetExecutingAssembly().Location).FullName;
И после этого
Directory.GetFiles(root, "*.dll");
Какой путь лучше? Есть ли лучшие способы?
Ответы
Ответ 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);
Результаты в тиках:
Итак, кажется, что 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