Wie finde ich den Pfad der Anwendung in einer Konsolenanwendung?
In Windows Forms kann ich Application.StartupPath
den aktuellen Pfad suchen, dies scheint jedoch in einer Konsolenanwendung nicht verfügbar zu sein.
c#
.net
console
console-application
JSmyth
quelle
quelle
Antworten:
System.Reflection.Assembly.GetExecutingAssembly()
. 1Location
Kombinieren Sie das mit,
System.IO.Path.GetDirectoryName
wenn Sie nur das Verzeichnis wollen.quelle
GetExecutingAssembly
Gibt eine Assembly zurück, die den aktuell ausgeführten Code enthält . Dies muss nicht unbedingt die .exe- Assembly der Konsole sein . Es kann sich um eine Baugruppe handeln, die von einem völlig anderen Ort geladen wurde. Sie müssen verwendenGetEntryAssembly
! Beachten Sie auch, dass diesCodeBase
möglicherweise nicht festgelegt wird, wenn sich die Baugruppe im GAC befindet. Die bessere Alternative istAppDomain.CurrentDomain.BaseDirectory
.Mit dem folgenden Code können Sie das aktuelle Anwendungsverzeichnis abrufen.
quelle
BaseDirectory
dies zur Laufzeit eingestellt werden kann? Es hat nur einen Getter.Sie haben zwei Möglichkeiten, um das Verzeichnis der Anwendung zu finden, das Sie je nach Verwendungszweck auswählen.
quelle
var localDirectory = new Uri(directory).LocalPath;
Wahrscheinlich etwas spät, aber das ist eine Erwähnung wert:
Oder genauer gesagt, um nur den Verzeichnispfad zu erhalten:
Bearbeiten:
Nicht wenige Leute haben darauf hingewiesen, dass
GetCommandLineArgs
die Rückgabe des Programmnamens nicht garantiert ist. Siehe Das erste Wort in der Befehlszeile ist der Programmname nur gemäß Konvention . In dem Artikel heißt es: "Obwohl extrem wenige Windows-Programme diese Eigenart verwenden (mir sind keine bekannt)." Es ist also möglich, zu "fälschen"GetCommandLineArgs
, aber es handelt sich um eine Konsolenanwendung. Konsolen-Apps sind normalerweise schnell und schmutzig. Das passt also zu meiner KISS-Philosophie.quelle
Für alle, die sich für asp.net Web Apps interessieren. Hier sind meine Ergebnisse von 3 verschiedenen Methoden
Ergebnis
Die App wird physisch von "C: \ inetpub \ SBSPortal_staging" ausgeführt, sodass die erste Lösung definitiv nicht für Web-Apps geeignet ist.
quelle
Die Antwort oben war 90% von dem, was ich brauchte, gab aber einen Uri anstelle eines regulären Pfades für mich zurück.
Wie im Beitrag in den MSDN-Foren erläutert , konvertieren Sie den URI-Pfad in einen normalen Dateipfad. Ich habe folgendes verwendet:
quelle
File.CreateDirectory(path)
, gibt es Ihnen die Ausnahme, dass es keine URI-Pfade erlaubt ...#
Zeichen) enthalten. Der Bezeichner und alles, was darauf folgt, wird vom resultierenden Pfad abgeschnitten.new Uri
undSystem.IO.Path.GetDirectoryName
? Das gibt Ihnen eine normale Pfadzeichenfolge anstelle von aUri
.Möglicherweise möchten Sie dies tun:
quelle
Sie können stattdessen diesen verwenden.
quelle
Wenn Sie nach einer .NET Core-kompatiblen Methode suchen, verwenden Sie
Dies wurde in .NET Framework 4.6 und .NET Core 1.0 (und .NET Standard 1.3) eingeführt. Siehe: AppContext.BaseDirectory-Eigenschaft .
Laut dieser Seite ,
quelle
Process.GetCurrentProcess().MainModule.FileName
Für Konsolenanwendungen können Sie Folgendes versuchen:
Ausgabe (auf meinem lokalen Computer):
Oder Sie können es versuchen (am Ende gibt es einen zusätzlichen Backslash):
Ausgabe:
quelle
BaseDirectory
kann zur Laufzeit eingestellt werden. Es ist NICHT garantiert, dass es korrekt ist"Ich habe diesen Code verwendet und die Lösung erhalten.
quelle
Sie können einfach zu Ihren Projektreferenzen hinzufügen
System.Windows.Forms
und diese dannSystem.Windows.Forms.Application.StartupPath
wie gewohnt verwenden.Sie brauchen also keine komplizierteren Methoden oder die Verwendung der Reflexion.
quelle
In der folgenden Zeile erhalten Sie einen Anwendungspfad:
Die obige Lösung funktioniert in den folgenden Situationen ordnungsgemäß:
mkbundle
Bundles (keine anderen Methoden funktionieren)quelle
Ich benutze dies, wenn die Exe durch Doppelklick aufgerufen werden soll
quelle
Ich habe benutzt
wenn ich einen Pfad relativ zu einem Anwendungsordner finden möchte. Dies funktioniert sowohl für ASP.Net- als auch für Winform-Anwendungen. Es ist auch kein Verweis auf System.Web-Assemblys erforderlich.
quelle
Ich meine, warum nicht ap / invoke Methode?
Sie würden es genau wie Application.StartupPath verwenden:
quelle
Assembly.GetEntryAssembly().Location
oderAssembly.GetExecutingAssembly().Location
In Kombination mit verwenden
System.IO.Path.GetDirectoryName()
, um nur das Verzeichnis abzurufen.Die Pfade von
GetEntryAssembly()
undGetExecutingAssembly()
können unterschiedlich sein, obwohl das Verzeichnis in den meisten Fällen dasselbe ist.Mit
GetEntryAssembly()
Ihnen bewusst sein, dass diese zurückgeben kann ,null
wenn das Eingabemodul unmanaged ist (dh C ++ oder VB6 ausführbar). In diesen Fällen ist es möglich,GetModuleFileName
über die Win32-API Folgendes zu verwenden:quelle
in VB.net
funktioniert bei mir (Anwendungstyp: Klassenbibliothek). Nicht sicher über C # ... Gibt den Pfad ohne Dateinamen als Zeichenfolge zurück
quelle
Behebt das Problem, indem auf Referenzdateien von Drittanbietern mit Installationspaketen verwiesen wird.
quelle
Keine dieser Methoden funktioniert in besonderen Fällen wie der Verwendung eines symbolischen Links zur Exe. Sie geben den Speicherort des Links zurück, nicht die tatsächliche Exe.
Sie können also QueryFullProcessImageName verwenden , um dies zu umgehen :
quelle
Versuchen Sie diese einfache Codezeile:
quelle
Eine andere Lösung besteht darin, relative Pfade zu verwenden, die auf den aktuellen Pfad zeigen:
quelle
Ich habe niemanden gesehen, der den von .Net Core Reflection bereitgestellten LocalPath in einen verwendbaren System.IO-Pfad konvertiert hat. Hier ist meine Version.
Dadurch wird der vollständig mit "C: \ xxx \ xxx" formatierte Pfad zu Ihrem Code zurückgegeben.
quelle
Es gibt viele Möglichkeiten, einen ausführbaren Pfad zu erhalten. Welchen Pfad wir verwenden sollten, hängt von unseren Anforderungen ab. Hier finden Sie einen Link, in dem verschiedene Methoden erläutert werden.
Verschiedene Möglichkeiten, um den ausführbaren Pfad der Anwendung abzurufen
quelle
Hier ist eine zuverlässige Lösung, die mit 32bit und 64bit funktioniert Anwendungen .
Fügen Sie diese Referenzen hinzu:
Fügen Sie diese Methode Ihrem Projekt hinzu:
Verwenden Sie es jetzt so:
Beachten Sie, dass diese Methode den entsprechenden ExecutePath zurückgibt, wenn Sie die ID des Prozesses kennen.
Extra für Interessierte:
... gibt Ihnen eine Reihe aller aktuell ausgeführten Prozesse und ...
... gibt Ihnen den aktuellen Prozess zusammen mit ihren Informationen, z. B. ID usw. und auch eingeschränkter Kontrolle, z. B. Töten usw. *
quelle
Sie können mit dem Projektmappen-Explorer einen Ordnernamen als Ressourcen im Projekt erstellen und anschließend eine Datei in die Ressourcen einfügen.
quelle