소스코드 

WindowsServiceTest.zip

 

=====

 

윈도우에서 데몬처럼 돌리기 위해 필요한 것이 서비스 프로그램이다.

 

Visual Studio 2010에서 서비스 프로그램을 만들어야 하는 상황이 와서

관련 내용을 찾아보니

C#으로 서비스 프로그램 만들기에 대한 기본 설명은

MSDN에 자세하게 나와있다.

https://msdn.microsoft.com/ko-kr/library/zt39148a(v=vs.110).aspx

 

하지만, 위의 링크에 있는 예제는 정상적으로 동작하지 않는다.

 

이유는?

 

위의 MSDN의 설명과는 다른 방식으로 구현한 예제를 소개하는 블러그도 있다.

 

명월일지

http://nowonbun.tistory.com/156

 

자신이 작성한 샘플 소스까지 제공하고 있긴 한데 MSDN의 기본 설명과는 다른 방식이라

일단 MSDN의 예제를 중심으로 해결해보려고 한다.

 

첫번째로 서비스 프로그램은 백그라운드 동작이기때문에

멀티테스킹이 기본적으로 가능해야 한다.

 

그래서 MSDN의 기본예제도 타이머로 작성되어있다.

 

하지만, MSDN의 소스코드를 그대로 따라해도 타이머가 동작하지 않는다.

 

왜?

아직 원인은 확인하지 못했지만

타이머 선언을 전역으로 빼주어도 마찬가지다.

 

어차피 쓰레드를 생성해서 동작시킬예정이라

쓰레드 처리가 가능하도록 예제를 구성하였다.

 

두번째는 서비스 프로그램이기때문에 따로 인터페이스가 없어

디버깅이나 관련 로그를 저장해야 하는데

서비스 이벤트로 발생하는 것도 하나의 방법이 되겠지만

따로 프로그램을 열고 아이디를 체크해야하는 것이 좀 귀찮은 작업이 될 수 있다.

 

실제 릴리즈 버젼으로 돌린다면야 이벤트 로그로 충분하겠지만

디버깅단게에선 많은 양의 로그를 양산할 가능성이 많기때문에

log4net을 이용해 로그를 남기려고 했지만

이 또한 실패

어셈블리(라이브러리)가 정상적으로 등록이 안되는 현상이 발생한다. ㅠㅠ;

(다른 프로그램에서는 잘돌아가는데 이상하다 서비스 프로젝트는 무슨 제약이 있는 것인가???)

 

이 문제는 추후에 다시 해결을 하기로 하고

일단 간단하게 텍스트 로그를 남기는 함수를 작성해서

샘플코드로 작성해보았다.

 

서비스 프로그램은 등록위치와 상관없이 시스템 폴더를 기준으로 동작하기 때문에

로그파일을 ".\"와 같이 현재 디렉토리로 지정하면 윈도우7의 경우

C:\Windows\SysWOW64

에 저장되게 된다.

 

따라서 파일입출력때 폴더지정이 필요하며

폴더가 없을경우 폴더생성부터 로그파일 생성까지 가능하며

INI파일을 읽어서 값을 세팅하는 것까지 샘플로 작성해서

쓰레드를 사용한 서비스 프로그램을 구현할 때 템플릿으로 사용가능하도록 구성하였다.

 

MSDN의 기본예제에 포함된 타이머코드는

훗날 원인 파악을 위해 일부러 남겨둔다.

 

---

 

그리고, 서비스 프로그램 작성시 MSDN에 따로 언급되어있지 않아서 잠시 착각했던 내용이

인스톨러를 생성하고 나서

serviceinstaller1.DisplayName이 실제 제어판의 서비스에서 표시되는 속성이라는 점이다.

 

이 이름을 다르게 하고 서비스에서 찾으니 안보일수밖에 ㅠㅠ;

 

 

 

서비스 프로그램 작성이 끝나면 실제 서비스에 등록할때

도스창과

Visual Studio > Visual Studio Tools > Visual Studio 명령 프롬프트

두가지를 선택할 수 있는데

 

도스창의 경우 vcvar32.bat를 실행해주거나 미리 패스를 잡아둬야한다.

 

또, 어느쪽을 사용하던지 윈도우7 이상에서는 반드시 관리자 권한으로 실행해야 한다.

 

안그려면 다음과 같은 오류메시지를 만나게 된다. ^^;

 

 

 

 

서비스 등록후 제어판 관리도구에서 서비스를 선택에 Start/Stop을 수행할 수 있으며

수동으로 시작할때 매개변수를 지정해 디버깅에 사용할 수 있다.

 

Posted by 휘프노스
,