Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#으로 개발한 Windows 서비스를 명령 프롬프트로 설치하는 방법 완벽 가이드

C#으로 Windows 서비스를 개발한 후에는 서비스 제어 관리자(Service Control Manager)에 등록해야 실제로 실행할 수 있습니다. 이 글에서는 Visual Studio에서 Windows 서비스 애플리케이션을 만들고, 설치 관리자(Installer)를 추가한 뒤, 명령 프롬프트의 InstallUtil.exe 도구를 사용해 서비스를 설치하고 실행까지 확인하는 전 과정을 단계별로 살펴봅니다.

1단계: Windows 서비스 프로젝트 생성

Visual Studio에서 새로운 Windows 서비스(.NET Framework) 프로젝트를 생성합니다. 템플릿 선택 시 'Windows Service' 항목을 찾아 선택하면 기본 서비스 클래스인 Service1.cs가 자동으로 생성됩니다.

2단계: 설치 관리자(Installer) 추가

Windows 서비스를 실행하려면 서비스를 서비스 제어 관리자(SCM)에 등록해 주는 설치 관리자가 반드시 필요합니다. 등록이 없으면 운영체제가 해당 서비스를 인식하지 못합니다.

Service1.cs [디자인] 화면에서 마우스 오른쪽 버튼을 클릭한 뒤 '설치 관리자 추가(Add Installer)'를 선택합니다. 그러면 ProjectInstaller.cs 파일이 자동으로 생성됩니다.

3단계: ProjectInstaller 코드 수정

ProjectInstaller.cs [디자인]에서 마우스 오른쪽 버튼을 클릭하고 '코드 보기(View Code)'를 선택합니다. 기본 생성된 코드는 다음과 같습니다.

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Threading.Tasks;
namespace DemoWindowsService{
    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer{
        public ProjectInstaller(){
            InitializeComponent();
        }
    }
}

F12 키를 눌러 InitializeComponent 클래스의 구현 부분으로 이동합니다. 여기서 서비스 이름과 설명을 추가하면, 설치 시 Windows 서비스 목록에 표시되는 이름과 설명이 됩니다.

private void InitializeComponent(){
    this.serviceProcessInstaller1 = new
    System.ServiceProcess.ServiceProcessInstaller();
    this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
    //
    // serviceProcessInstaller1
    //
    this.serviceProcessInstaller1.Account =
    System.ServiceProcess.ServiceAccount.LocalService;
    this.serviceProcessInstaller1.Password = null;
    this.serviceProcessInstaller1.Username = null;
    //
    // serviceInstaller1
    //
    this.serviceInstaller1.Description = "My Demo Service";
    this.serviceInstaller1.ServiceName = "DemoService";
    //
    // ProjectInstaller
    //
    this.Installers.AddRange(new System.Configuration.Install.Installer[] {
    this.serviceProcessInstaller1,
    this.serviceInstaller1});
}

위 코드에서 ServiceName은 서비스의 고유 식별 이름, Description은 서비스 목록에 표시될 설명입니다. 계정(Account)은 LocalService로 설정하여 별도의 사용자 자격 증명 없이도 서비스가 동작하도록 구성했습니다.

4단계: 서비스 로직 작성

이제 Service1.cs 클래스에 텍스트 파일에 로그 데이터를 기록하는 로직을 추가합니다. 서비스 시작 시 타이머가 5초 간격으로 작동하며, 시작·중지·주기적 호출 시각을 로그 파일에 남기는 구조입니다.

using System;
using System.IO;
using System.ServiceProcess;
using System.Timers;
namespace DemoWindowsService{
    public partial class Service1 : ServiceBase{
        Timer timer = new Timer();
        public Service1(){
            InitializeComponent();
        }
        protected override void OnStart(string[] args){
            WriteToFile("Service started at " + DateTime.Now);
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = 5000;
            timer.Enabled = true;
        }
        protected override void OnStop(){
            WriteToFile("Service stopped at " + DateTime.Now);
        }
        private void OnElapsedTime(object source, ElapsedEventArgs e){
            WriteToFile("Service recall at " + DateTime.Now);
        }
        public void WriteToFile(string Message){
            string path = @"D:\Demo";
            if (!Directory.Exists(path)){
                Directory.CreateDirectory(path);
            }
            string filepath = @"D:\Demo\Log.txt";
            if (!File.Exists(filepath)){
                using (StreamWriter sw = File.CreateText(filepath)){
                    sw.WriteLine(Message);
                }
            } else {
                using (StreamWriter sw = File.AppendText(filepath)){
                    sw.WriteLine(Message);
                }
            }
        }
    }
}

로그 저장 경로(D:\Demo)는 환경에 맞게 변경해서 사용하면 됩니다. 디렉터리가 없으면 자동으로 생성하고, 파일 존재 여부에 따라 새로 만들거나 내용을 덧붙이는 방식으로 동작합니다.

5단계: 명령 프롬프트로 서비스 설치하기

이제 명령 프롬프트를 사용해 Windows 서비스를 설치합니다. 먼저 관리자 권한으로 명령 프롬프트를 실행해야 하며, 일반 권한으로는 설치가 실패하므로 주의하세요.

.NET Framework의 InstallUtil.exe가 있는 폴더로 이동합니다.

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

다음으로, 빌드된 Windows 서비스 exe 파일이 있는 폴더를 열고 아래 명령어를 실행합니다. 경로의 [UserName] 부분은 본인의 Windows 사용자 이름으로 바꿔야 합니다.

InstallUtil.exe C:\Users\[UserName]\source\repos\DemoWindowsService\DemoWindowsService\bin\Debug\DemoWindowsService.exe

명령이 정상적으로 완료되면 콘솔에 'Commit phase completed successfully'와 유사한 성공 메시지가 출력됩니다. 참고로 64비트 환경에서 문제가 발생하면 Framework64 폴더(C:\Windows\Microsoft.NET\Framework64\v4.0.30319)의 InstallUtil.exe를 사용할 수도 있습니다.

설치 결과 확인

Windows 시작 메뉴에서 서비스(Services) 애플리케이션을 엽니다.

서비스 목록에서 앞서 설정한 'DemoService'가 등록되어 있고 정상적으로 실행 중인 것을 확인할 수 있습니다.

마지막으로 지정한 경로의 Log.txt 파일을 열어보면, 서비스가 실행되면서 시작 시각과 5초마다의 호출 기록이 예상대로 텍스트 파일에 기록되고 있는 것을 확인할 수 있습니다.

이로써 C#으로 개발한 Windows 서비스를 명령 프롬프트를 통해 설치하고 검증하는 전 과정이 완료되었습니다. 서비스를 제거해야 할 때는 동일한 InstallUtil.exe 명령에 /u 옵션(예: InstallUtil.exe /u 서비스경로)을 붙여 실행하면 됩니다.