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?
Author: Sam, 2008-12-12

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.

 60
Author: Greg Dean,
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;
}
 19
Author: Rob Prouse,
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.

 4
Author: eried,
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
 0
Author: Telan Niranga,
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.

 0
Author: Someguy,
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