2008-10-14 24 views
57

Jak mogę znaleźć folder, w którym plik .exe usługi Windows jest instalowany dynamicznie?Uzyskiwanie pełnej ścieżki do usługi systemu Windows

Path.GetFullPath(relativePath); 

zwraca ścieżkę na podstawie katalogu C:\WINDOWS\system32.

Jednak wydaje się, że metoda XmlDocument.Load(string filename) działa przeciwko względnej ścieżce wewnątrz katalogu, w którym zainstalowany jest plik .exe usługi.

Odpowiedz

82

Spróbuj

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

Krótkie i słodkie. :) –

+3

"System.Reflection.Assembly.GetEntryAssembly()" ma wartość null dla mojej usługi. –

+2

Spójrz na odpowiedź Curtisa Yallopa. Dużo lepiej! –

-4

ta powinna dać ścieżkę że wykonywalny mieszka w:

Environment.CurrentDirectory; 

Jeśli nie, można spróbować:

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

Bardziej hacky, ale sposób funkcjonalny:

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

:)

+5

-1: Environment.CurrentDirectory i twoje zhakowane rozwiązanie zwracają bieżący katalog roboczy, który z tego, co OP mówi, jest katalogiem system32. – Joe

5

To działa na naszą usługę Windows:

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

To powinno dać bezwzględną ścieżkę do pliku wykonywalnego.

5

Inna wersja powyższego:

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 zwraca bieżący katalog, w którym program jest uruchomiony. W przypadku usługi windows zwraca% WINDIR%/system32 ścieżkę, w której uruchamiany jest plik wykonywalny, a nie gdzie wdrożony plik wykonywalny.

65

Spróbuj tego:

AppDomain.CurrentDomain.BaseDirectory 

(Tak jak tutaj: How to find windows service exe path)

+0

+1 To rozwiązanie jest znacznie lepsze niż wybrane. –

+1

Dzięki za to. Miałem usługę NServiceBus, a ponieważ jest ona opakowana w NServiceBus.Host.exe, funkcja 'GetEntryAssembly()' miała zerowy poziom w moim rzeczywistym projekcie. Ten jednak działał idealnie. – Matt

Powiązane problemy