Pobieranie katalogu aplikacji z aplikacji WPF

170

Znalazłem rozwiązania dla Windows Forms z AppDomain, ale jaki byłby odpowiednik Applicationobiektu WPF ?

Joey
źródło

Odpowiedzi:

329

Jedna metoda:

System.AppDomain.CurrentDomain.BaseDirectory

Innym sposobem na zrobienie tego byłoby:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
Helen
źródło
Ach, dzięki. Musiał jakoś przeoczyć AppDomain. Szukałem tego, właściwie ...
Joey
3
@Helen: Sądząc po pozytywnych opiniach, jest to oczywiście doskonała odpowiedź. Jednak odpowiedź ma dwa sposoby na uzyskanie katalogu aplikacji. Czy oba będą działać równie dobrze?
Christoffer Lette
21
Skorzystałbym z pierwszej alternatywy. Wygląda na prostszą, nie ma wywołania metody i powoduje mniej wątpliwości co do tego, co faktycznie robi linia podczas czytania.
Filip
3
Użyłem pierwszej metody w usłudze WCF, w aplikacji WPF oraz w projekcie biblioteki klas i wszystko działało dobrze.
Apostrofix
1
Dla NetCore i NetStandard polecałbym drugą, ponieważ AppDomain została dodana w 2.0 i nie zawsze można ją było ustawić zgodnie z oczekiwaniami
cdie
28

Oto kolejny:

System.Reflection.Assembly.GetExecutingAssembly().Location
Eddie Butt
źródło
2
Ten pobiera lokalizację po skopiowaniu w tle , zgodnie z dokumentacją . Właściwie nie jestem pewien, czy kopiowanie w tle ma wpływ na sugestie w zaakceptowanej odpowiedzi.
Christoffer Lette,
2
To dało mi podkatalog biblioteki DLL, którą dzwoniłem, a nie główny katalog programu.
strattonn
7

Możesz także użyć pierwszego argumentu argumentów wiersza poleceń:

String exePath = System.Environment.GetCommandLineArgs()[0]

Trzepnięcie
źródło
1
Należy jednak zauważyć, że „zła” aplikacja może modyfikować argumenty wiersza poleceń.
Daniel Rose
@Daniel: Dlaczego miałby to sobie zrobić? Czy masz na myśli inną aplikację?
Merlyn Morgan-Graham
1
@Merlyn: Zobacz blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Zacytuję: jest to „wygodnie zainicjowany parametr kodu startowego procesu”. Możesz więc celowo lub nieumyślnie zmodyfikować tę lokalizację pamięci.
Daniel Rose,
1
@Daniel: Kto może? Inny proces czy ten sam proces? Jeśli strzelisz sobie w stopę, powinno być łatwo wytropić. Nazwałbym to mniej złym, a głupszym :) Jeśli inny proces może to zrobić, to jest to bardziej interesujące. Edycja: nie widzę nic w tym artykule na temat modyfikowania wiersza poleceń uruchomionego programu - tylko to, że proces uruchamiania przekazuje go (nie jestem pewien, czy proces uruchamiania jest niepożądany, aby proces uruchamiania zmieniał wiersz poleceń) i że można go zapytać przez WMI.
Merlyn Morgan-Graham
@ MerlynMorgan-Graham złośliwa aplikacja może zmodyfikować adres pamięci i zmusić aplikację do uruchomienia innej złośliwej aplikacji. To jest złe, ponieważ powiedzmy, że ich aplikacja jest keyloggerem i chcą, aby aktywował się, gdy tylko otworzysz specjalną aplikację. Więc w swoim kodzie przechwycą nazwę twojej aplikacji, uruchomią swój keylogger w tle, a następnie uruchomią twoją aplikację. Użytkownik nie będzie miał pojęcia. Artykuł wyjaśnia to, ale nie mówi, jak to zrobić. Może tego właśnie szukałeś?
pqsk
6

Użyłem po prostu string baseDir = Environment.CurrentDirectory;i to działa dla mnie.

Powodzenia

Edytować:

Kiedyś usuwałem ten typ błędu, ale wolę go edytować, ponieważ myślę, że minus w tej odpowiedzi pomaga ludziom dowiedzieć się o złym sposobie. :) Zrozumiałem, że powyższe rozwiązanie nie jest przydatne i zmieniłem je na string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Inne sposoby, aby je uzyskać:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

Powodzenia

QMaster
źródło
3
To jest bieżący katalog roboczy. Może się to wiązać z katalogiem aplikacji, ale są to osobne pojęcia (a co najważniejsze, katalog roboczy może się zmienić, np. Jeśli masz otwarte wspólne okno dialogowe pliku).
Joey
1
@joey masz rację. Zmieniłem to na to: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Dzięki.
QMaster
3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Spróbuj tego!

Arsen Mkrtchyan
źródło
3

Spróbuj tego. Nie zapomnij using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
Roshan J.
źródło
1

Próbowałem tego:

    label1.Content = Directory.GetCurrentDirectory();

i pobierz także katalog.

Paweł
źródło
Pobiera bieżący katalog roboczy, który może różnić się od katalogu procesu.
Thraka
Chyba muszę ocenić Directory.GetCurrentDirectory (); więcej. Dziękuję @Thraka za poprawkę.
paul
0

Możesz również swobodnie używać Application.StartupPath z System.Windows.Forms, ale musisz dodać odwołanie do zestawu System.Windows.Forms!

wypadek
źródło