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?

Antworten:


329

Eine Methode:

System.AppDomain.CurrentDomain.BaseDirectory

Ein anderer Weg wäre:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

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

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]


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


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!


3

Versuche dies. Vergiss nicht using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

Ich habe es versucht:

    label1.Content = Directory.GetCurrentDirectory();

und hol dir auch das verzeichnis.


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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.