매우 간단한 .NET Windows 서비스를 만들고 InstallUtil.exe 유틸리티를 사용하여 설치했습니다.
서비스에는 다음과 같은 코드가 있습니다.
if (File.Exists("test_file.txt"))
{
// Do something clever
}
서비스와 동일한 디렉토리에 test_file.txt라는 파일을 만들었지 만 코드의 주석 처리 된 부분이 실행되지 않습니다 ...?
답변:
서비스는 Service Control Manager라는 응용 프로그램에서 시작됩니다. 이 응용 프로그램은 시스템 디렉터리 % WinDir % \ System32에 있습니다.
Windows 7 Ultimate-64 비트에서이 경로는 실제로 : % WinDir % \ SysWOW64입니다.
자세한 내용은 MSDN의 서비스 제어 관리자를 참조하십시오 .
원래 게시물의 문제를 지적 해 주신 Harper Shelby에게 감사드립니다.
%WinDir%\SysWOW64
대신
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());
현재 디렉토리를 출력합니다. 해당 코드를 서비스의 시작 방법에 넣고 DebugView 와 같은 도구를 사용 하여 출력을 확인하십시오. 그러면 서비스의 시작 폴더를 알 수 있습니다.
이 간단한 기술은 서비스 개발의 많은 문제, 특히 서비스 시작을 디버그하는 데 유용합니다.
서비스의 작업 폴더가 서비스 실행 파일이있는 폴더가 될 것으로 예상했을 것입니다 (저도 마찬가지). 다음 코드 줄을 사용하여 해당 폴더로 변경할 수 있습니다.
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
또한 Windows 서비스가 실행중인 폴더를 알고 싶었지만 소스 코드가 내 것이 아니 어서 수정할 수 없었습니다. 명령 프롬프트에 입력 sc qc <service name>
하면 BINARY_PATH_NAME의 폴더가 표시됩니다.
C:\>sc qc
DESCRIPTION:
Queries the configuration information for a service.
USAGE:
sc <server> qc [service name] <bufferSize>
MyService를 쿼리하면 다음을 얻을 수 있습니다.
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
sc qc apache2.4
쇼 ...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice
,하지만 작업 디렉토리 대신입니다%WinDir%\System32
에서 폴더에있는 SC 시작 서비스 / 시작의 : / : 하나 개의 간단한 대안은 사용 nssm.cc에 - 이것은 당신의 시작 디렉토리를 지정하는 옵션을 제공합니다.