[C#] 서비스 프로그램

개발 노트/C#  2012.10.05 13:40



안녕하세요. 개발자 명월입니다.

이번 포스팅에서는 서비스 프로그램에 등록되는 프로그램을 작성해보도록 해보겠습니다. 우리가 서버 프로그램을 만들때 서비스 프로그램이 아닌 일반 프로그램을 띄우게 될 경우 서버의 섹션을 로그아웃하게 되면 프로그램도 종료 되는 것을 많이 경험을 하셨을 겁니다.

그러나 IIS 라던가 DBSql 같은 경우는 윈도우 세션이 종료가 되더라도 프로세스 안에서 돌게 됩니다. 이것은 이 프로세스들이 사용자 섹션 안에 상주 하는 것이 아니라 로컬 섹션에서 실행되는 프로그램이기에 사용자 세션이 종료가 되더라도 프로세스들이 꺼지지 않는 이유 입니다. 

그럼 로컬 세션 프로세스는 어디서 실행 되는 지 알아보도록 하겠습니다.


시작 -> 내컴퓨터 -> 마우스 오른쪽마우스 -> 관리




컴퓨터 관리 -> 서비스에 등록 되는 프로그램입니다.

여기에 들어가는 프로세스들은 사용자가 누구와는 관계없이 로컬 세션이 시작되면 실행되는 프로세스 입니다.


여기에 들어가는 프로그램을 작성해 보도록하겠습니다.


1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.IO; 5 using System.ComponentModel; 6 using System.Configuration.Install; 7 using System.ServiceProcess; 8 9 namespace Blog20121005 10 { 11 [RunInstallerAttribute(true)] 12 public class MyProjectInstaller : Installer { 13 public MyProjectInstaller() { 14 ServiceProcessInstaller processInstaller = new ServiceProcessInstaller(); 15 processInstaller.Account = ServiceAccount.LocalService; 16 ServiceInstaller serviceInstaller = new ServiceInstaller(); 17 serviceInstaller.StartType = ServiceStartMode.Automatic; 18 serviceInstaller.ServiceName = "명월서비스"; 19 Installers.Add(serviceInstaller); 20 Installers.Add(processInstaller); 21 } 22 } 23 public partial class Service1 : ServiceBase { 24 Program p; 25 protected override void OnStart(string[] args) 26 { 27 p = new Program(); 28 } 29 protected override void OnStop() 30 { 31 p.Dispose(); 32 } 33 } 34 public class Program : IDisposable 35 { 36 static void Main(string[] args) 37 { 38 ServiceBase.Run(new Service1()); 39 } 40 public Program() { 41 FileStream FS = new FileStream("C:\\TEST.txt", FileMode.Append, FileAccess.Write); 42 StreamWriter SW = new StreamWriter(FS); 43 SW.WriteLine(DateTime.Now.ToString()+" 서비스 프로그램이 실행되었습니다."); 44 SW.Close(); 45 FS.Close(); 46 } 47 public void Dispose() { 48 FileStream FS = new FileStream("C:\\TEST.txt", FileMode.Append, FileAccess.Write); 49 StreamWriter SW = new StreamWriter(FS); 50 SW.WriteLine(DateTime.Now.ToString() + " 서비스 프로그램이 종료되었습니다."); 51 SW.Close(); 52 FS.Close(); 53 } 54 } 55 } 56



옆에 System.ServiceProcess, System.Configuration.Install 을 선언해야 합니다.



Start 일때는 생성자를 호출하고 Stop 일때는 Dispose 함수를 호출합니다.



Start 일때는 C드라이브 Test.txt 에 서비스 프로그램을 실행시킨다라는 문구의 텍스트 파일을 만들고 Stop 일때는 서비스 프로그램을 종료 시킨다라는 문구의 텍스트 파일을 만들겠습니다.


결과 화면



컴파일을 하면 실행할 수 없다라는 오류가 나옵니다. 이것은 CMD에서 실행하는 프로그램이 아닌 서비스 프로그램에서 실행시키는 프로그램이니 오류가 나오는 것 입니다.


이제 등록을 해 보겠습니다. 시작 프로그램 -> Visual Studio -> Visual Studio tool -> CMD



해당 디버그 된 폴더로 이동합니다.

이동하여 installutil 해당파일.exe




등록이 완료 되었습니다.

다시 서비스 화면으로 가보겠습니다.



서비스에 등록이 되어있습니다. 상태를 보니 아직 시작은 되지 않았습니다.

오른쪽 마우스 클릭 후 속성 창에 들어가 확인 해 보겠습니다.



위에 로그온 탭에서 로컬 시스템 계정으로 바꾸어 줍니다.



다시 오른 쪽 마우스를 눌러서 시작 버튼을 누릅니다.




그럼 아까 시작 했을때 C:\에 Test.txt 파일을 만들기로 했으니 확인해보겠습니다.



이렇게 서비스 프로그램에 스래드를 걸고 소켓서비스를 달면 네트워크 서버로 이용할 수 있고 기타 등등 로그시스템등을 만들어 사용할 수 있습니다.

그 서비스를 지우지 말고 컴퓨터를 계속 재부팅 해보면 Test.txt 의 쌓이는 값을 보면 확인 하실 수 있습니다.


참고 소스 :   Blog20121005.zip

 

'개발 노트 > C#' 카테고리의 다른 글

[C#] 퍼즐 게임 - 3  (0) 2012.10.10
[C#] 스니퍼  (2) 2012.10.09
[C#] 비프음  (0) 2012.10.06
[C#] 퍼즐게임 - 2  (0) 2012.10.05
[C#] 서비스 프로그램  (0) 2012.10.05
[C#] 퍼즐게임 - 1  (0) 2012.10.04
[C#] GDI 좌표계  (0) 2012.10.01
[C#] 물리 함수식 만들기 - 공 튀기기 -  (2) 2012.09.25
[C#] 전역 후킹 프로그램  (7) 2012.09.20

댓글 0개가 달렸습니다.
댓글쓰기