2009-05-19 18 views
56

Stworzyłem bardzo prostą usługę .NET Windows i zainstalowałem ją za pomocą narzędzia InstallUtil.exe.W jakim katalogu działa usługa Windows?

w służbie Mam kawałek kodu, takich jak:

if (File.Exists("test_file.txt")) 
{ 
    // Do something clever 
} 

Został utworzony plik o nazwie test_file.txt w tym samym katalogu co usługa ale komentowanej części kodu nie są nigdy wykonany...?

+0

Czy użytkownik, który uruchamia usługę mają poprawne uprawnienia do pliku? – CSharpAtl

Odpowiedz

51

Usługi są uruchamiane z poziomu aplikacji o nazwie Service Control Manager. Aplikacja ta mieszka w katalogu systemowym % windir% \ System32

w systemie Windows 7 Ultimate - 64 bity tej ścieżki jest faktycznie: % windir% \ SysWOW64

Więcej informacji można znaleźć Service Control Manager at MSDN.

Dzięki Harper Shelby za wskazanie problemu z oryginalnym postem.

+1

svchost.exe jest hostem usług dla większości wewnętrznych usług Windows. Usługi mogą, a w przypadku usług innych niż Windows, najprawdopodobniej działać na innym hoście exe. – Michael

+2

Prawy katalog, niewłaściwy powód. –

+1

Dzięki - upuszczenie pliku sprawia, że ​​działa, więc mogę potwierdzić, że lokalizacja: c: \ windows \ system32 – Guy

78
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory()); 

wyświetli bieżący katalog. Umieść ten kod w metodzie uruchamiania usługi i użyj narzędzia, takiego jak DebugView, aby sprawdzić dane wyjściowe. Wtedy poznasz folder startowy swojej usługi.

Ta prosta technika przydaje się przy wielu problemach z rozwojem usług, zwłaszcza w debugowaniu uruchomienia usługi.

Prawdopodobnie folder roboczy usługi był folderem, w którym znajduje się plik wykonywalny usługi (tak jak ja). Można zmienić do tego folderu przy użyciu następujących linii kodu:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
+1

To bardzo fajna wskazówka - dzięki! – Guy

+1

+! dla dobrego rozwiązania problemu. –

11

można zrobić to działa tak:

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]); 
Directory.SetCurrentDirectory(cwd ?? "."); 
+1

+1, to pozwala reszcie aplikacji działać tak, jakby był normalnie wywołanym plikiem .exe, gdzie katalog bieżący jest ścieżką. Dzięki, właśnie tego potrzebowałem! Unikano konieczności przepisywania kodu, który używał względnych ścieżek. – Paul

2

chciał także wiedzieć, w którym folderze usługa Windows został uruchomiony, ale kod źródłowy nie był mój, więc nie mogłem go zmodyfikować. Wpisanie w wierszu polecenia sc qc <service name> wyświetla folder w BINARY_PATH_NAME.

C:\>sc qc 
DESCRIPTION: 
     Queries the configuration information for a service. 
USAGE: 
     sc <server> qc [service name] <bufferSize> 

gdy MyService zapytania otrzymujemy:

C:> sc qc MyService

[SC] QueryServiceConfig SUCCESS 

SERVICE_NAME: MyService 
     TYPE    : 10 WIN32_OWN_PROCESS 
     START_TYPE   : 3 DEMAND_START 
     ERROR_CONTROL  : 1 NORMAL 
     BINARY_PATH_NAME : "D:\Routines\MyService\MyService.exe" 
     LOAD_ORDER_GROUP : 
     TAG    : 0 
     DISPLAY_NAME  : MyService 
     DEPENDENCIES  : 
     SERVICE_START_NAME : LocalSystem 
+0

To jest ścieżka, w której znajduje się plik binarny usługi, który nie ma gwarancji, że jest równy katalogowi "działającej bieżącej" usługi, która może się zmieniać wielokrotnie podczas czasu działania (usługi). Względne nazwy plików (jak w przykładzie OP) są rozwiązywane względem bieżącego katalogu roboczego, a nie katalogu, w którym znajduje się plik wykonywalny. –

+0

'sc qc apache2.4' pokazuje' ... BINARY_PATH_NAME: "E: \ root \ Public Cache \ Apache Httpd \ httpd-2.4.20-x86-vc11 \ Apache24 \ bin \ httpd.exe" -k runservice', ale katalog roboczy jest zamiast '% WinDir% \ System32' – Pacerier

Powiązane problemy