본문 바로가기
소소한 C# 지식

[C#]C#으로 Window Service(윈도우 서비스) 만들기

by 해뤼맘 2022. 4. 21.
728x90
반응형

안녕하세요

C#으로 Window Service를 만들어 보겠습니다.

 

1. 윈도우 서비스란?

  • 장 시간 실행되는 실행 애플리케이션으로 만들 수 있습니다.
  • 컴퓨터가 부팅되면서 자동적으로 시작되고, 사용자 상호작용 없이 멈추거나 재 시작될 수 있습니다.
  • 명령 줄 도구는 InstallUtill에 서비스 실행 파일 경로를 전달하여 쉽게 설치할 수 있습니다.

2. 윈도우 서비스를 왜 사용하는가?

  • 어떠한 비즈니스에서 가장 일반적인 요구 사항의 하나가 특정 주기 기반으로 오랜 시간 스케줄 작업할 수 있는 서비스입니다. 예를 들면, 매일 오후 뉴스레터를 보낸다던가, 매 시간마다 고객에게 메일 알림을 보내는 것입니다.
  • 그래서 어떠한 윈도우 서비스를 만드는 것은 신뢰할 수 있는 솔루션의 하나가 될 수 있습니다.

3. Window Service (윈도우 서비스) 프로젝트 만들기

  • 새 프로젝트 추가에서 Windows 서비스(. NET Framework)를 선택하고, 이름과 위치를 수정해서 윈도우 프로젝트를 생성합 니다.

윈도우 서비스 프로젝트 추가
윈도우 서비스 프로젝트 추가

  • 생성된 프로젝트 폴더 아래 Service1.cs 파일 명을 원하는 이름으로 변경하고, 아래처럼 디자인 보기에서 오른쪽 버튼을 클릭하여 [설치 관리자 추가]를 클릭합니다.

윈도우 서비스 - 설치관리자 추가
설치 관리자 추가

 

  • 설치 관리자를 추가하면 ProjectInstaller.cs라는 파일이 생성됩니다. 이 ProjectInstaller.cs라는 파일에는
  • ServiceProcessInstaller와 ServiceInstaller라는 컴포넌트가 생성됩니다.
  • ServiceProcessInstaller와 ServiceInstaller는 이름을 변경하여 사용하셔도 됩니다.(저는 뒤에 test만 붙였습니다.)
  • ServiceProcessInstaller 컴포넌트의 속성 창을 열어서 기능에 따른 계정 권한이 필요하면 Account 속성에서 필요한 계정을 선택하시면 됩니다.
  • ServiceInstaller 컴포넌트의 속성 창을 열어서 Name, ServiceName, DisplayName, StartType을 필요한 값으로 변경하여 사용하시면 됩니다.

ProjectInstaller.cs
ProjectInstaller.cs

 

  • 아래 코드는 Servicebase로부터 상속받은 WindowServiceTest클래스는 기본 생성자 OnStart(), Onstop()의 두 개의 멤버 함수로 구성됩니다. 
  • 생성자에 주기적인 실행을 위해서 Timer 객체를 생성하고, 초기 주기와 그 주기가 되었을 경우 발생하는 타이머 이벤트에 주기적으로 서비스를 실행할 메서드를 등록합니다.
  • 윈도우 서비스가 시작될 경우에는 Onstart() 이벤트가 실행되며, Timer의 Enabled 속성에 true값을 설정하여 서비스가 시작됩니다.
  • 서비스가 중지 또는 종료 시에는 Onstop() 이벤트가 실행되고 Timer의 Enabled 속성에 false값을 설정하여 서비스가 중지되도록 합니다.
 public partial class WindowServiceTest : ServiceBase
    {
        Timer timeScheduler = null;
        private const string folderPath = "C:\\temp||test||";
        private const string filePath = folderPath + "service.txt";
        StreamWriter sw;

        public WindowServiceTest()
        {
            InitializeComponent();

            timeScheduler = new Timer();
            timeScheduler.Interval = 30000; // 30sec
            timeScheduler.Elapsed += TimeScheduler_elapsed;
         }


        protected override void OnStart(string[] args)
        {
            if(!Directory.Exists(filePath))
                Directory.CreateDirectory(folderPath);
  
            timeScheduler.Enabled = true;
        }

 
        private void TimeScheduler_elapsed(object sender, ElapsedEventArgs e)
        {
            sw = new StreamWriter(filePath, true);
            sw.WriteLine(DateTime.Now.ToString());
            sw.Close();

        }

        protected override void OnStop()
        {
            timeScheduler.Enabled=false;    
            timeScheduler.Dispose();

        }


    }

 

4. Window Service(윈도우 서비스) 설치 및 제거하기

  • 윈도우 서비스 명령줄 도구인 InstallUtil.exe를 통해서 윈도우 서비스 애플리케이션을 등록하거나 제거합니다.
  • 등록된 윈도우 서비스 애플리케이션은 Services.msc에서 서비스명으로 확인할 수 있습니다.
  • 윈도우 서비스 설치하기 : InstallUtil.exe "설치할 윈도우 서비스 애플리케이션 실행 파일 패스명"
  • 윈도우 서비스 제거하기 : InstallUtil.exe /u "제거할 윈도우 서비스 애플리케이션 실행 파일 패스명"

 

728x90
반응형

댓글