Jaki jest najlepszy sposób na określenie katalogu głównego aplikacji?
Muszę pobrać wszystkie biblioteki DLL w katalogu głównym mojej aplikacji. Jak najlepiej to zrobić?
string root = Application.StartupPath;
Lub
string root = new FileInfo(Assembly.GetExecutingAssembly().Location).FullName;
A potem
Directory.GetFiles(root, "*.dll");
Która droga jest lepsza? Są lepsze sposoby? 5 answers
AppDomain.CurrentDomain.BaseDirectory
to mój sposób na to.
Jednakże:
Application.StartupPath
pobiera katalog Twojego pliku wykonywalnego
AppDomain.BaseDirectory
pobiera katalog używany do rozwiązywania zespołów
Ponieważ mogą być różne, być może chcesz użyć aplikacji.StartupPath, chyba że zależy ci na uchwale zgromadzenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 19:16:36
To zależy. Jeśli chcesz mieć katalog EXE, który uruchomił aplikację, wtedy jeden z twoich dwóch przykładów będzie działał. Pamiętaj jednak, że. NET jest bardzo elastyczny i może być tak, że inna aplikacja połączyła się z Twoim EXE i wywołuje go, prawdopodobnie z innego katalogu.
To nie zdarza się zbyt często i prawdopodobnie napisałbyś, gdyby tak było, ale jest taka możliwość. Z tego powodu wolę określić, który zespół mnie interesuje i uzyskać katalog od tego. Wtedy wiem, że dostaję wszystkie biblioteki DLL w tym samym katalogu, co ten konkretny montaż. Na przykład, jeśli masz aplikację MyApp.exe z klasą w nim MyApp.MyClass, wtedy byś to zrobił;
string root = string.Empty;
Assembly ass = Assembly.GetAssembly( typeof( MyApp.MyClass ) );
if ( ass != null )
{
root = ass.Location;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 14:10:34
To jest stare pytanie, ale zawsze używałem:
Environment.CurrentDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
Jednak patrząc na rozwiązania tutaj myślę, że trzeba wykonać kilka prostych testów:
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);
Wyniki w kleszczach:
- 49
- 306
- 166
- 26
- 201
Więc wydaje się AppDomain.CurrentDomain.BaseDirectory
jest to droga do zrobienia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 17:29:33
Jeśli chcesz uzyskać główną ścieżkę folderu aplikacji, użyj poniższego kodu.
string path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-05 10:52:38
Używam
Path.GetDirectoryName(new Uri(Assembly.GetEntryAssembly().CodeBase).LocalPath)
Zgromadzenie.Lokalizacja będzie wskazywać na kopiowanie cieni, jeśli używasz kopiowania cieni, więc użycie bazy kodowej jest lepszą opcją, ale baza kodowa jest adresem Url.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 17:31:33