2008-10-14 15 views
57

Wie kann ich den Ordner ermitteln, in dem die Windows-Dienst-EXE-Datei dynamisch installiert wird?Den vollständigen Pfad für Windows-Dienst abrufen

Path.GetFullPath(relativePath); 

gibt einen Pfad basierend auf C:\WINDOWS\system32 Verzeichnis zurück.

Die Methode XmlDocument.Load(string filename) scheint jedoch gegen den relativen Pfad innerhalb des Verzeichnisses zu arbeiten, in dem die EXE-Datei für den Dienst installiert ist.

Antwort

82

Versuchen

System.Reflection.Assembly.GetEntryAssembly().Location 
+1

Kurz und gut. :) –

+3

"System.Reflection.Assembly.GetEntryAssembly()" ist null für meinen Dienst. –

+2

Sehen Sie sich die Antwort von Curtis Yallop an. Viel besser! –

-4

Dies sollte Ihnen den Weg geben, dass die ausführbare Datei befindet sich in:

Environment.CurrentDirectory; 

Wenn nicht, könnten Sie versuchen:

Directory.GetParent(Assembly.GetEntryAssembly().Location).FullName 

Eine hacky, aber Funktionsweise:

Path.GetFullPath("a").TrimEnd('a') 

:)

+5

-1: Environment.CurrentDirectory und Ihre Hacky-Lösung geben beide das aktuelle Arbeitsverzeichnis zurück, was laut OP das System32-Verzeichnis ist. – Joe

5

Dies funktioniert für unsere Windows-Dienst:

//CommandLine without the first and last two characters 
//Path.GetDirectory seems to have some difficulties with these (special chars maybe?) 
string cmdLine = Environment.CommandLine.Remove(Environment.CommandLine.Length - 2, 2).Remove(0, 1); 
string workDir = Path.GetDirectoryName(cmdLine); 

Dies sollte man den absoluten Pfad der ausführbaren Datei geben.

5

Eine andere Version der oben:

string path = Assembly.GetExecutingAssembly().Location; 
FileInfo fileInfo = new FileInfo(path); 
string dir = fileInfo.DirectoryName; 
38
Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) 
3

Environment.CurrentDirectory aktuelle Verzeichnis zurück, wo Programm läuft. Im Falle eines Windows-Dienstes wird der Pfad% WINDIR%/system32 zurückgegeben, bei dem die ausführbare Datei ausgeführt wird und nicht die ausführbare Datei.

65

Versuchen Sie folgendes:

AppDomain.CurrentDomain.BaseDirectory 

(Genau wie hier: How to find windows service exe path)

+0

+1 Diese Lösung ist viel besser als die ausgewählte. –

+1

Danke dafür. Ich hatte einen NServiceBus-Dienst, und da es in NServiceBus.Host.exe verpackt ist, war die 'GetEntryAssembly()' in meinem aktuellen Projekt null. Dieser hat aber perfekt funktioniert. – Matt

Verwandte Themen