Den absoluten Pfad der ausführbaren Datei mit C # ermitteln?

78

Schauen Sie sich diesen Pseudocode an:

string exe_path = system.get_exe_path()
print "This executable is located in " + exe_path

Wenn ich das obige Programm erstelle und die ausführbare Datei darin platziere C:/meow/, wird sie bei This executable is located in C:/meow/jeder Ausführung unabhängig vom aktuellen Arbeitsverzeichnis ausgedruckt.

Wie könnte ich dies mit leicht erreichen C#?

Dante May Code
quelle

Antworten:

107

MSDN hat einen Artikel , der sagt, zu verwenden System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; Wenn Sie das Verzeichnis benötigen, verwenden Sie es System.IO.Path.GetDirectoryNamefür dieses Ergebnis.

Oder es gibt die kürzere Application.ExecutablePathOption "Ruft den Pfad für die ausführbare Datei ab, mit der die Anwendung gestartet wurde, einschließlich des Namens der ausführbaren Datei", sodass dies je nach Start der Anwendung möglicherweise etwas weniger zuverlässig ist.

Mark Rushakoff
quelle
29
System.Reflection.Assembly.GetExecutingAssembly () erhält die EXE-Assembly nur, wenn sie von dort aufgerufen wird. GetEntryAssembly () erhält die richtige Assembly.
GraemeF
6
Dies ist besonders wichtig, wenn Sie einen Windows-Dienst erstellen, da der Dienst über C: \ Windows \ System32 gestartet wird und Sie über dieses Arbeitsverzeichnis verfügen. Ich werde stattdessen die Methode von GraemeF verwenden.
Kevindaub
55
Die oben erwähnte Methode gibt den aktuellen Pfad als URI zurück (dh "file: // c: \\ data"). Was funktionierte war: System.Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location ) );
Arikfr
18
Es ist eigentlich "System.IO.Path". Der vollständig qualifizierte Name mit dem richtigen Namespace sollte also lauten: System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly (). Location)
Victor Chelaru
9
noelicus: Gemäß der Antwort und den Kommentaren ist die sichere und genaue Methode, die fast immer korrekt funktioniert: System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetEntryAssembly (). Location)
Graham Laight
55
AppDomain.CurrentDomain.BaseDirectory
Flüssiger Kern
quelle
9
Dies ist die beste und einfachste Antwort. Diese Methode funktioniert unter Linux / Mono und Windows, unabhängig vom aktuellen Verzeichnis.
raider33
12
using System.Reflection;

string myExeDir = new FileInfo(Assembly.GetEntryAssembly().Location).Directory.ToString();
newb
quelle
1
Schön, obwohl es vereinfacht werden kann System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), was auch schneller ist.
mklement0
4
var dir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

Ich sprang ein, um die bestbewertete Antwort zu erhalten, und stellte fest, dass ich nicht das bekam, was ich erwartet hatte. Ich musste die Kommentare lesen, um herauszufinden, wonach ich suchte.

Aus diesem Grund veröffentliche ich die in den Kommentaren aufgeführte Antwort, um ihr die Belichtung zu geben, die sie verdient.

user1
quelle
1
Schön, obwohl es sein sollte .GetEntryAssembly(), nicht .GetExecutingAssembly().
mklement0
2

Angenommen, ich habe eine .config-Datei in der Konsolen-App und werde jetzt wie folgt.

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\YourFolderName\\log4net.config";
Muhammad Mubashir
quelle
2
Es wird nicht garantiert, dass CurrentDirectory das Verzeichnis ist, in dem die Anwendung ausgeführt wird.
3
Bitte benutzen Path.Combine. Es gibt eine Menge Code, der in Mono von manuell kombinierten Pfaden wie diesem nicht richtig funktioniert.
Joseph Lennox
1

Auf meiner Seite habe ich mit einem Formularantrag verwendet:

String Directory = System.Windows.Forms.Application.StartupPath;

Es nimmt den Startpfad der Anwendung.

Sébastien
quelle
0

Derjenige, der für mich funktioniert hat und nicht oben ist, war Process.GetCurrentProcess().MainModule.FileName.

Charles A.
quelle