Abrufen des Anwendungsverzeichnisses von einer WPF-Anwendung

170

Ich habe mit AppDomain Lösungen für Windows Forms gefunden, aber was entspricht einem WPF- ApplicationObjekt?

Joey
quelle

Antworten:

329

Eine Methode:

System.AppDomain.CurrentDomain.BaseDirectory

Ein anderer Weg wäre:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
Helen
quelle
Ah danke. Muss AppDomain irgendwie übersehen haben. Eigentlich habe ich danach gesucht ...
Joey
3
@Helen: Nach den positiven Stimmen zu urteilen, ist dies offensichtlich eine ausgezeichnete Antwort. Die Antwort bietet jedoch zwei Möglichkeiten, um das App-Verzeichnis abzurufen. Werden beide gleich gut funktionieren?
Christoffer Lette
21
Ich würde die erste Alternative verwenden. Es sieht einfacher aus, hat keinen Methodenaufruf und verursacht weniger Zweifel daran, was die Zeile beim Lesen tatsächlich tut.
Filip
3
Ich habe die erste Methode in einem WCF-Dienst, in einer WPF-Anwendung und in einem Klassenbibliotheksprojekt verwendet und insgesamt gut funktioniert.
Apostrofix
1
Für NetCore und NetStandard würde ich die zweite empfehlen, da AppDomain in 2.0 hinzugefügt wurde und nicht immer wie erwartet eingestellt werden konnte
cdie
28

Hier ist noch einer:

System.Reflection.Assembly.GetExecutingAssembly().Location
Eddie Butt
quelle
2
Dieser erhält den Speicherort nach dem Schattenkopieren , wie in den Dokumenten angegeben . Ich bin mir eigentlich nicht sicher, ob die Vorschläge in der akzeptierten Antwort vom Schattenkopieren betroffen sind.
Christoffer Lette
2
Dies gab mir das Unterverzeichnis der DLL, die ich aufrief, nicht das Hauptprogrammverzeichnis.
Strattonn
7

Sie können auch das erste Argument der Befehlszeilenargumente verwenden:

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

Flip
quelle
1
Beachten Sie jedoch, dass eine "böse" Anwendung ihre Befehlszeilenargumente ändern kann.
Daniel Rose
@ Daniel: Warum sollte es sich selbst antun? Oder meinst du eine andere Anwendung?
Merlyn Morgan-Graham
1
@ Merlyn: Siehe blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Ich zitiere: Es ist ein "bequem initialisierter Parameter für den Startcode des Prozesses". Sie können diesen Speicherort also absichtlich oder versehentlich ändern.
Daniel Rose
1
@ Daniel: Wer kann? Ein anderer Prozess oder der gleiche Prozess? Wenn Sie sich in den Fuß schießen, sollte es leicht zu finden sein. Ich würde das weniger böse und dümmer nennen :) Wenn ein anderer Prozess das kann, dann ist das interessanter. Bearbeiten: In diesem Artikel wird nichts zum Ändern der Befehlszeile eines laufenden Programms angezeigt - nur, dass der Startvorgang diese übergibt (nicht sicher, ob es für den Startvorgang unerwünscht ist, die Befehlszeile zu ändern) und dass Sie sie abfragen können über WMI.
Merlyn Morgan-Graham
@ MerlynMorgan-Graham Eine böswillige Anwendung kann die Speicheradresse ändern und Ihre Anwendung dazu zwingen, stattdessen eine andere ihrer bösartigen Anwendungen auszuführen. Das ist böse, denn sagen wir, ihre Anwendung ist ein Keylogger und sie möchten, dass sie aktiviert wird, sobald Sie eine bestimmte Anwendung öffnen. In ihrem Code erfassen sie also Ihren Anwendungsnamen, führen ihren Keylogger im Hintergrund aus und führen dann Ihre Anwendung aus. Der Benutzer wird ahnungslos sein. Der Artikel erklärt dies zwar, sagt Ihnen aber nicht, wie es geht. Vielleicht haben Sie danach gesucht?
pqsk
6

Ich habe einfach string baseDir = Environment.CurrentDirectory;und seine Arbeit für mich verwendet.

Viel Glück

Bearbeiten:

Früher habe ich diese Art von Fehler gelöscht, aber ich bevorzuge es, sie zu bearbeiten, weil ich denke, dass der Minuspunkt in dieser Antwort den Leuten hilft, über den falschen Weg Bescheid zu wissen. :) Ich habe verstanden, dass die obige Lösung nicht nützlich ist und ich habe sie in string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Andere Möglichkeiten geändert , um sie zu erhalten:

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);

Viel Glück

QMaster
quelle
3
Das ist das aktuelle Arbeitsverzeichnis. Es kann mit dem Anwendungsverzeichnis übereinstimmen, aber dies sind separate Konzepte (und vor allem kann sich das Arbeitsverzeichnis ändern, z. B. wenn Sie ein gemeinsames Dateidialogfeld geöffnet haben).
Joey
1
@joey du hast recht. Ich habe es folgendermaßen geändert: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Vielen Dank.
QMaster
3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Versuche dies!

Arsen Mkrtchyan
quelle
3

Versuche dies. Vergiss nicht using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
Roshan J.
quelle
1

Ich habe es versucht:

    label1.Content = Directory.GetCurrentDirectory();

und hol dir auch das verzeichnis.

paul
quelle
Dadurch wird das aktuelle Arbeitsverzeichnis abgerufen, das sich vom Prozessverzeichnis unterscheiden kann.
Thraka
Ich denke, ich muss Directory.GetCurrentDirectory () auswerten; Mehr. Vielen Dank an @Thraka für die Korrektur.
Paul
0

Sie können Application.StartupPath auch frei von System.Windows.Forms verwenden, aber Sie müssen eine Referenz für die System.Windows.Forms-Assembly hinzufügen!

Absturz
quelle