Stworzyłem bardzo prostą usługę .NET Windows i zainstalowałem ją za pomocą narzędzia InstallUtil.exe.
W serwisie mam taki fragment kodu:
if (File.Exists("test_file.txt"))
{
// Do something clever
}
Utworzyłem plik o nazwie test_file.txt w tym samym katalogu co usługa, ale skomentowana część kodu nigdy nie jest wykonywana ...?
.net
windows-services
Chłopak
źródło
źródło
Odpowiedzi:
Usługi są uruchamiane z aplikacji o nazwie Service Control Manager. Ta aplikacja znajduje się w katalogu systemowym % WinDir% \ System32
W systemie Windows 7 Ultimate - 64 bity ta ścieżka to w rzeczywistości: % WinDir% \ SysWOW64
Aby uzyskać więcej informacji, zobacz Service Control Manager w witrynie MSDN .
Dzięki Harper Shelby za wskazanie problemu z oryginalnym postem.
źródło
%WinDir%\SysWOW64
zamiast tegoSystem.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 będzie przydatna przy wielu problemach w rozwoju usług, szczególnie w przypadku debugowania uruchamiania usług.
Prawdopodobnie spodziewałeś się, że folder roboczy twojej usługi będzie folderem, w którym znajduje się plik wykonywalny usługi (tak samo jak ja). Możesz przejść do tego folderu, używając następujących wierszy kodu:
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
źródło
Możesz to zrobić tak:
string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]); Directory.SetCurrentDirectory(cwd ?? ".");
źródło
Chciał również wiedzieć, w którym folderze działa usługa systemu Windows, ale kod źródłowy nie był mój, więc nie mogłem go zmodyfikować. Wpisanie
sc qc <service name>
w wierszu polecenia powoduje wyświetlenie folderu w postaci BINARY_PATH_NAME.C:\>sc qc DESCRIPTION: Queries the configuration information for a service. USAGE: sc <server> qc [service name] <bufferSize>
gdy zapytanie MyService otrzyma:
C:> sc qc Moja usługa
[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
źródło
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 tego%WinDir%\System32
Z usługi startowej SC w folderze / Start in: / : Jedną prostą alternatywą jest użycie nssm.cc - daje to możliwość określenia katalogu, w którym ma się rozpocząć.
źródło