윈도우에서 데몬역할을 하는 서비스 프로그램

 

C#에서 만들어 보자

 

기존 테스트용으로 개발한 프로그램을 그대로 사용하면서

서비스로 등록하는 방법을 찾아보니

다음과 같은 방법을 사용해 서비스로 구성하면

평상시엔 테스트용으로 사용하면서

서비스 관리자에 등록 가능한 프로그램으로 구성하는 것이 가능하였다.

 

일단 먼저 새 프로젝트를 만든다.

프로젝트를 만들때 [Windows 서비스]를 선택하면

아래와 같이 서비스 실행을 위한 Main 함수를 가진 프로젝트가 생성이 된다.

 

원출처

https://stpetrus27.wordpress.com/2014/08/01/c-windows-forms-in-windows-service/

 

관련 MSDN

https://msdn.microsoft.com/ko-kr/library/zt39148a(VS.80).aspx

 

 

<일반적인 서비스 프로그램 Main 함수>

 

private static void Main()
{
    ServiceBase[] ServicesToRun =
    {
        new Service1()
    };
    ServiceBase.Run(ServicesToRun);
}

 

<Windows Forms Application Main 함수>

 

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

 


참조한 내용에 따르면 폼과 서비스를 동시에 사용하기 위해 폼을 호출할 때

가장 좋은 방법은 새로운 단일 스레드를 생성하여 폼을 호출하는 것이다.

따라서 서비스 프로그램에 기존에 작성한 폼 파일을 추가한 뒤에 다음과 같이 코드를 수정하면

일반적인 실행과 서비스 등록 실행이 모두 가능한 프로그램으로 사용할 수 있다.

 

private static void Main()
{
    if (Environment.UserInteractive)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(true);
 
        ThreadStart oThredProc = delegate { Application.Run(new Form1()); };
        var thread = new Thread(oThredProc);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
    }
    else
    {
        ServiceBase[] ServicesToRun =
        {
            new Service1()
        };
        ServiceBase.Run(ServicesToRun);
    }
}

 

물론 쓰레드와 폼과 관련된 using과 참조를 추가해주는 것은 필수~

 


Posted by 휘프노스
,