2024년 11월 7일 목요일

C# 으로 윈도우 서비스 만들기

C# 에서 윈도우 서비스를 만들수있다..  (.NetFrameWork로 해야함!!)

모니터링 용도나 간단한 질의응답용 서버를 만들때 등등 백그라운드에서

항시 시작되었으면 하는 프로그램이 있을때 주로 사용된다. 

서비스로 등록을 해놓으면 윈도우가 시작될때 자동으로 시작된다. (설정시)

물론 시작프로그램에 등록해도 되지만 UI가 필요없기도 하거니와 

트레이아이콘등으로 실행하게 해놓더라도 미관상 좋지 않다.


1.  먼저 C#으로 Windows 서비스 프로젝트 하나 만든다.


2. Procgram.cs 에서  SericeBase를 상속받은 클래스를 실행시키는걸 볼수 있다. 

(나는 이름 바꾸기를 통해서 그 클래스의 이름을 TRService로 바꿨음)

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
    new TRService()
};
ServiceBase.Run(ServicesToRun);


3. 해당 클래스에 보면 OnStart와 OnStop을 오버라이드한다.. 여기다가 시작할때랑 종료할때의 코드를 집어 넣으면 된다.  간단히 'C:\Temp\' 폴더에 mylog.txt에 매초마다 시간을 출력하는 서비스를 만들어봄.

public partial class TRService : ServiceBase
{
    /// 내부 멤버
    private System.Timers.Timer _timer;
    private const string folderPath = @"C:\Temp\";
    private const string filePath = folderPath + "mylog.txt";

    /// 생성자
    public TRService()
    {
        InitializeComponent();
    }

    /// 시작할때
    protected override void OnStart(string[] args)
    {
        if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); }
        WriteLog("서비스 시작한다");

        //타이머 시작
        _timer = new System.Timers.Timer();
        _timer.Interval = 1000;
        _timer.Elapsed += Timer_Tick;
        _timer.Start();
    }

    /// 온타이머
    private void Timer_Tick(object sender, ElapsedEventArgs e)
    {
        WriteLog("나야~ 타이머.. :" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
    }

    /// 종료할때
    protected override void OnStop()
    {
        _timer.Stop();
        WriteLog("서비스 종료한다");
    }

    /// 라이트로그
    private void WriteLog(string strMsg)
    {
        using (StreamWriter sw = new StreamWriter(filePath, true))
        {
            sw.WriteLine(strMsg);
            sw.Close();
        }
    }
}


4. Sift + F7로 디자인타임으로 나가서 ServiceName의 속성값을 내가 원하는 서비스이름으로 변경한다.  나는 'MyTRService' 로 했음 


5. 이제 빌드하면 bin 폴더에 exe파일로 생성되는데.. 이파일들을 'C:\Temp\ServiceTest' 로 복사해줌 

6. 다른 인스톨러를 이용하면 설치가 쉽게 되겠지만  sc 커맨드 명령으로도 충분히 서비스 등록이 가능하다. 간단한 sc 명령은 다음과 같다.

서비스 만들기: sc create 서비스명 binPath="만든exe파일의 절대경로" 
서비스 시작하기: sc start 서비스명
서비스 중지하기: sc stop 서비스명
서비스 삭제하기: sc delete 서비스명
서비스 상태조회: sc query 서비스명

이정도만 알아도 충분함


7. 이제 명령프롬프트로 등록후 시작하고 서비스 목록에 가보면 서비스 목록이 나와있다.



8. 해당파일의 내용도 매초마다 출력하고 있음.



9. 서비스를 중지하고 싶으면 중지처리를 하면되고 윈도우 시작시 자동으로 등록하고 싶으면 시작유형을 자동으로 바꿔주면 됨..


ㅇㅇ
 

댓글 없음:

댓글 쓰기