Ich habe einen sehr einfachen .NET Windows-Dienst erstellt und ihn mit dem Dienstprogramm InstallUtil.exe installiert.
Im Service habe ich einen Code als solchen:
if (File.Exists("test_file.txt"))
{
// Do something clever
}
Ich habe eine Datei mit dem Namen test_file.txt im selben Verzeichnis wie der Dienst erstellt, aber der kommentierte Teil des Codes wird nie ausgeführt ...?
.net
windows-services
Kerl
quelle
quelle
Antworten:
Dienste werden über eine Anwendung namens Service Control Manager gestartet. Diese Anwendung befindet sich im Systemverzeichnis % WinDir% \ System32
Unter Windows 7 Ultimate - 64 Bit lautet dieser Pfad tatsächlich: % WinDir% \ SysWOW64
Weitere Informationen finden Sie unter Service Control Manager bei MSDN .
Vielen Dank an Harper Shelby für den Hinweis auf ein Problem mit dem ursprünglichen Beitrag.
quelle
%WinDir%\SysWOW64
stattdessenSystem.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());
gibt das aktuelle Verzeichnis aus. Fügen Sie diesen Code in die Startmethode Ihres Dienstes ein und überprüfen Sie die Ausgabe mit einem Tool wie DebugView . Dann kennen Sie den Startordner Ihres Dienstes.
Diese einfache Technik ist bei vielen Problemen bei der Dienstentwicklung hilfreich, insbesondere beim Debuggen des Dienststarts.
Sie haben wahrscheinlich erwartet, dass der Arbeitsordner Ihres Dienstes der Ordner ist, in dem sich die ausführbare Dienstdatei befindet (ich auch). Sie können mit den folgenden Codezeilen zu diesem Ordner wechseln:
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
quelle
Sie können es so machen:
string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]); Directory.SetCurrentDirectory(cwd ?? ".");
quelle
Wollte auch wissen, in welchem Ordner ein Windows-Dienst ausgeführt wurde, aber der Quellcode gehörte nicht mir und konnte daher nicht geändert werden.
sc qc <service name>
Wenn Sie die Eingabeaufforderung eingeben, wird der Ordner in BINARY_PATH_NAME angezeigt.C:\>sc qc DESCRIPTION: Queries the configuration information for a service. USAGE: sc <server> qc [service name] <bufferSize>
bei Abfrage MyService erhalten:
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
quelle
sc qc apache2.4
zeigt...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice
, aber das Arbeitsverzeichnis ist stattdessen%WinDir%\System32