다음을 통해 공유


Windows 서비스 애플리케이션 소개

비고

이 문서는 .NET의 호스트된 서비스에는 적용되지 않습니다. Windows 서비스 사용 Microsoft.Extensions.Hosting.BackgroundService 및 작업자 서비스 템플릿의 최신 콘텐츠는 다음을 참조하세요.

이전의 NT 서비스로 알려진 Microsoft Windows 서비스를 사용하면 자체 Windows 세션에서 실행되는 장기 실행 실행 애플리케이션을 만들 수 있습니다. 이러한 서비스는 컴퓨터가 부팅될 때 자동으로 시작되고, 일시 중지 및 다시 시작할 수 있으며, 사용자 인터페이스를 표시하지 않을 수 있습니다. 이러한 기능을 사용하면 서버에서 또는 동일한 컴퓨터에서 작업하는 다른 사용자를 방해하지 않는 장기 실행 기능이 필요할 때마다 서비스를 사용하기에 적합합니다. 로그온한 사용자 또는 기본 컴퓨터 계정과 다른 특정 사용자 계정의 보안 컨텍스트에서 서비스를 실행할 수도 있습니다. 서비스 및 Windows 세션에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.

서비스로 설치된 애플리케이션을 만들어 서비스를 쉽게 만들 수 있습니다. 예를 들어 성능 카운터 데이터를 모니터링하고 임계값에 대응하려는 경우를 가정해 보겠습니다. 성능 카운터 데이터를 수신 대기하고, 애플리케이션을 배포하고, 데이터 수집 및 분석을 시작하는 Windows 서비스 애플리케이션을 작성할 수 있습니다.

서비스를 Microsoft Visual Studio 프로젝트로 만들어 서비스에 보낼 수 있는 명령과 해당 명령을 받을 때 수행해야 하는 작업을 제어하는 코드를 정의합니다. 서비스로 보낼 수 있는 명령에는 서비스 시작, 일시 중지, 다시 시작 및 중지가 포함됩니다. 사용자 지정 명령을 실행할 수도 있습니다.

애플리케이션을 만들고 빌드한 후 명령줄 유틸리티 InstallUtil.exe 실행하고 서비스의 실행 파일에 경로를 전달하여 설치할 수 있습니다. 그런 다음 서비스 제어 관리자 를 사용하여 서비스를 시작, 중지, 일시 중지, 다시 시작 및 구성할 수 있습니다. 서버 탐색기의 서비스 노드에서 또는 클래스 사용하여 ServiceController 이러한 동일한 작업을 대부분 수행할 수도 있습니다.

서비스 애플리케이션 및 기타 Visual Studio 애플리케이션

서비스 애플리케이션은 여러 가지 방법으로 다른 많은 프로젝트 형식과 다르게 작동합니다.

  • 프로젝트가 의미 있는 방식으로 작동하려면 서비스 애플리케이션 프로젝트에서 만드는 컴파일된 실행 파일을 서버에 설치해야 합니다. F5 또는 F11 키를 눌러 서비스 애플리케이션을 디버그하거나 실행할 수 없습니다. 서비스를 즉시 실행하거나 코드를 한 단계씩 실행할 수 없습니다. 대신 서비스를 설치하고 시작한 다음 디버거를 서비스 프로세스에 연결해야 합니다. 자세한 내용은 방법: Windows 서비스 애플리케이션 디버그를 참조하세요.

  • 일부 유형의 프로젝트와 달리 서비스 애플리케이션에 대한 설치 구성 요소를 만들어야 합니다. 설치 구성 요소는 서버에 서비스를 설치 및 등록하고 Windows Services 제어 관리자를 사용하여 서비스에 대한 항목을 만듭니다. 자세한 내용은 방법: 서비스 애플리케이션에 설치 관리자 추가를 참조하세요.

  • 서비스 애플리케이션에 대한 메서드는 Main 프로젝트에 포함된 서비스에 대해 실행 명령을 실행해야 합니다. 이 메서드는 Run 적절한 서버의 Services Control Manager 에 서비스를 로드합니다. Windows Services 프로젝트 템플릿을 사용하는 경우 이 메서드가 자동으로 작성됩니다. 서비스 로드는 서비스 시작과 동일하지 않습니다. 자세한 내용은 아래의 "서비스 수명"을 참조하세요.

  • Windows 서비스 애플리케이션은 로그온한 사용자의 대화형 스테이션과 다른 창 스테이션에서 실행됩니다. 창 스테이션은 클립보드, 전역 원자 집합 및 데스크톱 개체 그룹을 포함하는 보안 개체입니다. Windows 서비스의 스테이션은 대화형 스테이션이 아니므로 Windows 서비스 응용 프로그램 내에서 발생한 대화 상자가 표시되지 않으며 프로그램이 응답하지 않을 수 있습니다. 마찬가지로 오류 메시지는 사용자 인터페이스에서 발생하는 것이 아니라 Windows 이벤트 로그에 기록되어야 합니다.

    .NET Framework에서 지원하는 Windows 서비스 클래스는 대화형 스테이션, 즉 로그온한 사용자와의 상호 작용을 지원하지 않습니다. .NET Framework에는 스테이션 및 데스크톱을 나타내는 클래스도 포함되지 않습니다. Windows 서비스가 다른 스테이션과 상호 작용해야 하는 경우 관리되지 않는 Windows API에 액세스해야 합니다. 자세한 내용은 Windows SDK 설명서를 참조하세요.

    사용자 또는 다른 스테이션과 Windows 서비스의 상호 작용은 로그온한 사용자가 없거나 예기치 않은 데스크톱 개체 집합이 있는 사용자와 같은 시나리오를 포함하도록 신중하게 설계되어야 합니다. 경우에 따라 사용자의 제어 하에 실행되는 Windows 애플리케이션을 작성하는 것이 더 적절할 수 있습니다.

  • Windows 서비스 애플리케이션은 자체 보안 컨텍스트에서 실행되며 사용자가 설치된 Windows 컴퓨터에 로그인하기 전에 시작됩니다. 서비스를 실행할 사용자 계정을 신중하게 계획해야 합니다. 시스템 계정으로 실행되는 서비스에는 사용자 계정보다 더 많은 권한과 권한이 있습니다.

서비스 수명

서비스는 수명 동안 여러 내부 상태를 거닐게 됩니다. 먼저 서비스가 실행될 시스템에 설치됩니다. 이 프로세스는 서비스 프로젝트에 대한 설치 관리자를 실행하고 해당 컴퓨터의 Services Control Manager 에 서비스를 로드합니다. Services Control Manager는 Windows에서 서비스를 관리하기 위해 제공하는 중앙 유틸리티입니다.

서비스가 로드된 후에는 서비스를 시작해야 합니다. 서비스를 시작하면 작동을 시작할 수 있습니다. Services Control Manager, 서버 탐색기 또는 코드에서 메서드를 Start 호출하여 서비스를 시작할 수 있습니다. 메서드는 Start 애플리케이션의 OnStart 메서드에 처리를 전달하고 사용자가 정의한 코드를 처리합니다.

실행 중인 서비스는 중지되거나 일시 중지되거나 컴퓨터가 종료될 때까지 이 상태에 무기한 존재할 수 있습니다. 서비스는 세 가지 Running기본 상태 중 하나인 , Paused또는 Stopped.에 있을 수 있습니다. 서비스에서 보류 중인 명령ContinuePendingPausePendingStartPendingStopPending의 상태를 보고할 수도 있습니다. 이러한 상태는 실행 중인 서비스를 일시 중지하는 명령과 같이 명령이 실행되었지만 아직 수행되지 않았음을 나타냅니다. 쿼리 Status 하여 서비스의 상태를 확인하거나 이러한 상태가 발생할 때 작업을 수행하는 데 사용할 WaitForStatus 수 있습니다.

서비스 제어 관리자, 서버 탐색기 또는 코드에서 메서드를 호출하여 서비스를 일시 중지, 중지 또는 다시 시작할 수 있습니다. 이러한 각 작업은 서비스에서 연결된 프로시저(OnStop또는OnPause)를 호출할 수 있으며, OnContinue서비스에서 상태를 변경할 때 수행할 추가 처리를 정의할 수 있습니다.

서비스 유형

.NET Framework를 사용하여 Visual Studio에서 만들 수 있는 두 가지 유형의 서비스가 있습니다. 프로세스에서 유일한 서비스인 서비스에는 형식 Win32OwnProcess이 할당됩니다. 프로세스를 다른 서비스와 공유하는 서비스에는 형식 Win32ShareProcess이 할당됩니다. ServiceType 속성을 쿼리하여 서비스 유형을 검색할 수 있습니다.

Visual Studio에서 생성되지 않은 기존 서비스를 쿼리하는 경우 다른 서비스 유형이 표시되는 경우도 있습니다. 이에 대한 자세한 내용은 다음을 참조하세요 ServiceType.

서비스 및 ServiceController 구성 요소

ServiceController 구성 요소는 설치된 서비스에 연결하고 상태를 조작하는 데 사용됩니다. 구성 요소를 사용하여 ServiceController 서비스를 시작 및 중지하고, 해당 기능을 일시 중지하고 계속하며, 사용자 지정 명령을 서비스에 보낼 수 있습니다. 그러나 서비스 애플리케이션을 만들 때는 구성 요소를 사용할 ServiceController 필요가 없습니다. 실제로 대부분의 경우 ServiceController 구성 요소는 서비스를 정의하는 Windows 서비스 애플리케이션과 별도의 애플리케이션에 있어야 합니다.

자세한 내용은 ServiceController를 참조하세요.

요구 사항

  • 서비스는 클래스에서 상속받고 빌드 시 .exe 파일을 생성하는 ServiceBase 애플리케이션 프로젝트 또는 다른 .NET Framework 지원 프로젝트에서 만들어야 합니다.

  • Windows 서비스를 포함하는 프로젝트에는 프로젝트 및 해당 서비스에 대한 설치 구성 요소가 있어야 합니다. 이 작업은 속성 창에서 쉽게 수행할 수 있습니다. 자세한 내용은 방법: 서비스 애플리케이션에 설치 관리자 추가를 참조하세요.

참고하십시오