1135 Stimmen

Wie kann ich den Pfad der Anwendung in einer .NET-Konsolenanwendung ermitteln?

Wie finde ich den Pfad der Anwendung in einer Konsolenanwendung?

Unter Windows-Formulare kann ich verwenden Application.StartupPath um den aktuellen Pfad zu finden, aber das scheint in einer Konsolenanwendung nicht verfügbar zu sein.

7 Stimmen

Installieren Sie .NET Framework auf dem Zielcomputer (Client, Entwicklung)? wenn Ihre Antwort wahr ist; So können Sie einen Verweis auf System.Windows.Forms.dll hinzufügen und Application.StartupPath verwenden! Dies ist der beste Weg, wenn Sie weitere zukünftige Ausnahmen vermeiden wollen!

0 Stimmen

AppDomain.BaseDirectory ist das App-Verzeichnis. Beachten Sie, dass sich die Anwendung in der VS-Umgebung anders verhalten kann als in der Win-Umgebung. Aber AppDomain sollte gleich sein, nicht wie application.path, aber ich hoffe, dass dies nicht nur für IIS ist.

1355voto

Sam Axe Punkte 32502

System.Reflection.Assembly.GetExecutingAssembly() . Location 1

Kombinieren Sie das mit System.IO.Path.GetDirectoryName wenn Sie nur das Verzeichnis haben wollen.

1 Wie in der Anmerkung von Herrn Mindor:
System.Reflection.Assembly.GetExecutingAssembly().Location gibt den Ort zurück, an dem sich die ausführende Baugruppe derzeit befindet, was der Ort sein kann, an dem sich die Baugruppe befindet, wenn sie nicht ausgeführt wird, aber auch nicht sein muss. Im Falle von Schattenkopien von Baugruppen erhalten Sie einen Pfad in einem temporären Verzeichnis. System.Reflection.Assembly.GetExecutingAssembly().CodeBase gibt den 'permanenten' Pfad der Baugruppe zurück.

486voto

Sie können den folgenden Code verwenden, um das aktuelle Anwendungsverzeichnis zu ermitteln.

AppDomain.CurrentDomain.BaseDirectory

216voto

Mr.Mindor Punkte 4009

Sie haben zwei Möglichkeiten, das Verzeichnis der Anwendung zu finden. Welche Sie wählen, hängt von Ihrem Zweck ab.

// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests, 
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);

100voto

Steve Mc Punkte 3273

Wahrscheinlich ein bisschen spät, aber das ist eine Erwähnung wert:

Environment.GetCommandLineArgs()[0];

Oder besser gesagt, um nur den Verzeichnispfad zu erhalten:

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

Edita:

Mehrere Personen haben darauf hingewiesen, dass GetCommandLineArgs ist nicht garantiert, dass der Programmname zurückgegeben wird. Siehe Das erste Wort in der Befehlszeile ist nur per Konvention der Programmname . In dem Artikel heißt es: "Obwohl nur sehr wenige Windows-Programme diese Eigenart nutzen (mir selbst sind keine bekannt)". Es ist also möglich, zu "fälschen". GetCommandLineArgs aber wir sprechen hier von einer Konsolenanwendung. Konsolenanwendungen sind in der Regel schnell und schmutzig. Das passt also zu meiner KISS-Philosophie.

bearbeiten Aus dem Feedback geht hervor, dass die meisten anderen Lösungen nicht funktionieren, wenn Sie ein Unit-Testing-System verwenden. Das macht irgendwie Sinn, da das ausführbare Element nicht Ihre Anwendung, sondern das Testsystem ist. Ich habe das nicht nachgeprüft - ich könnte also völlig falsch liegen. Sollte dies der Fall sein, werde ich diese Bearbeitung löschen.

51voto

rocketsarefast Punkte 3994

Für alle, die sich für asp.net-Webanwendungen interessieren. Hier sind meine Ergebnisse von 3 verschiedenen Methoden

protected void Application_Start(object sender, EventArgs e)
{
  string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
  string p3 = this.Server.MapPath("");
  Console.WriteLine("p1 = " + p1);
  Console.WriteLine("p2 = " + p2);
  Console.WriteLine("p3 = " + p3);
}

Ergebnis

p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging

die Anwendung wird physisch von " C:\inetpub\SBSPortal_staging "Die erste Lösung ist also definitiv nicht für Webanwendungen geeignet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X