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#?



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.


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

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

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.


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

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.


0

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

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.