[C#] 자동 업데이트 프로그램

2009/07/29 16:37

사용자 삽입 이미지
 프로그램의 자동 업데이트 기능은 인터넷 보급율이 타의 추종을 불허하는 국내에서는 필수적인 요소가 되어 버렸다. V3, 알약 같은 백신은 물론이고, 곰플레이어 등 사용자 Application에도 모두 포함되어 있다.

2년 전쯤에 간단한 기능의 자동 업데이트 프로그램을 만든 적 있었는데; 지인들도 찾지 않는 내 유령 블로그에서 (사실 나도 거의 하지 않는다..) 가장 인기 게시물이었다; 그 프로그램과 관련해 질문도 많이 받고, 링크 복구 요청도 많이 받아... 마지막으로 다시 올린다.

아래 DLL과 자동 업데이트 프로그램은 Microsoft Visual Studio.NET 2005를 이용해 C#으로 개발하였으며, 사용한 모든 함수는 Microsoft .NET Framework 2.0에 포함되어 있다.

 일단 자동 업데이트 프로그램의 구성은 매우 심플하다.
(1) 프로그램 버전 체크를 위한 DLL과 Configuration 파일
- UpdateChecker.dll
- update.ini

(2) 프로그램 업데이트를 위한 자동 업데이트 프로그램과 Configuration 파일
- SmartUpdater.exe
- start.ini

 프로그램의 자동 업데이트 로직은 간단하다. (물론, 복잡하게 만들려면 복잡하게도 만들 수 있으나, 그건 각자의 특수성에 맞게 고민해야할 문제.)

STEP 1. 프로그램을 실행한다.

STEP 2. 업데이트 서버에 연결하여, 현재 프로그램의 버전과 업데이트 서버가 가지고 있는 업데이트 버전과 비교해서 최신 업데이트가 있으면, 자동 업데이트 프로그램을 실행하고, 현재 프로그램을 종료한다.

 물론, 간혹 이런 경우도 있다. 자동 업데이트 프로그램을 업데이트해야 되는 경우; 그 때는 실행하기 전 자동 업데이트 프로그램의 파일명을 rename해서 변경한 후, 실행하면 된다; 그리고 프로그램 업데이트 후, rename된 자동 업데이트 프로그램을 삭제하면 끝;

(1) 프로그램 버전 체크를 위한 DLL의 함수들
사용자 삽입 이미지

DLL의 함수는 달랑 3개다. (하나는 기본 생성자)

ReadConfigFile은 업데이트 서버의 주소와 버전 정보가 담긴 파일명이 저장된 Configuration 파일(update.ini)을 읽는다. 말이 거창하게 Configuration 파일이지, 실제로 파일을 열어보면 달랑 2줄의 내용이 들어있다.

라인 1: http://www.nohungry.net/UpdateServer/
라인 2: version.txt

라인 1은 Update 서버의 URL이고, (반드시 끝에 /를 붙여줘야 한다.)
라인 2는 버전 정보가 저장된 파일명이다.

IsNewUpdateExists는 인자(parameter)로 현재 프로그램의 버전과 업데이트 서버의 버전 정보 파일(http://www.nohungry.net/UpdateServer/version.txt)에 저장된 버전을 비교하여, 현재 프로그램의 버전이 구버전인 경우, true를 반환하고 아니면 false를 반환한다.

GetLastError는 UpdateCheck 시 발생한 에러 메시지를 반환한다. 예를 들면, 업데이트 서버를 연결할 수 없다거나, 새로운 업데이트 파일이 없다는 내용을 반환한다.

(2) 프로그램 업데이트를 위한 자동 업데이트 프로그램
 자동 업데이트 프로그램은 상기 업데이트 체크 DLL에서 새로운 업데이트가 존재할 경우, 호출되는 프로그램이다. 이 프로그램은 업데이트 서버에서 업데이트 파일들을 다운로드 받고, 설치하는 역할을 한다.

 자동 업데이트 프로그램의 Configuration 파일(start.ini) 역시 DLL과 마찬가지로 단순한 정보를 담고 있다.
라인 1: http://www.nohungry.net/UpdateServer/
라인 2: file_list.txt
라인 3: MyNewProgram.exe

라인 1은 업데이트 서버의 URL
라인 2는 업데이트 파일 목록이 저장된 파일명
라인 3은 업데이트 완료 후, 실행할 파일명

사실 업데이트 서버 URL이나 이런 것들은 보안을 생각한다면, 위에 예처럼 무식하게 텍스트 파일로 쓰는 것은 좋지 않다. 이러한 것들은 바이너리로 저장한다거나 아니면 Configuration 파일이 아닌 레지스트리에 쓴다거나 아니면 기타 각자의 아이디어를 이용하도록 하자.

앞서 언급한 DLL과 자동 업데이트 프로그램을 이용해, 내 프로그램에 자동 업데이트 기능을 구현해보자고 한다면, 다음과 같이 할 수 있다. (예외 처리나 기타 복잡한 내용은 빼고, 심플한 코드)

사용자 삽입 이미지

이 게시물에 언급한 모든 내용 및 소스 코드는 아래 링크에서 다운로드 가능합니다.
http://www.nohungry.net/Data/SmartUpdateChecker.zip

관련 게시물 주소
http://www.nohungry.net/tt1/34

이 소스를 그대로 쓰시든지 수정해서 상용으로 쓰시든지 모든 것이 자유입니다. 단, 수정 요청은 받지 않습니다.
또한, 이 소스를 이용해 발생한 어떠한 문제도 책임지지 않습니다.

끝으로 이 게시물의 소스를 다운로드 받아가시거나, 게시물 내용을 블로그에 퍼가시더라도... 댓글이나 출처는 꼭 남겨주세요!
크리에이티브 커먼즈 라이센스
Creative Commons License

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/147

Comments

  1. 지송 2009/08/21 11:21

    잘보고 갑니다.

    소스는 다운 받았습니다. ^^ 공부좀 해보려고요...

    수고하세요.

    perm. |  mod/del. |  reply.
  2. Lani 2009/09/09 11:12

    잘 보고 갑니다. 다운로드 기능 구현해야 하는데 참고할께요..

    perm. |  mod/del. |  reply.
  3. 감사해요 2009/11/10 23:09

    졸업작품하려는데 많은 도움이 되는거같네요 ㅎㅎ 감사합니다

    perm. |  mod/del. |  reply.
    • 노헝그리 2009/11/16 15:35

      별 말씀을...^^;

  4. SGP 2010/07/19 09:47

    다운로드 기능 구현하려고 서핑중에 우연히 발견했네요
    감사히 잘 사용하겠습니다

    perm. |  mod/del. |  reply.

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]

사용자 삽입 이미지

올 가을에 구현한 화옹시험포 계측 모니터링 시스템이다, 화옹시험포는 바다를 매립하여 인공적으로 조성한 간척지로.. 이 곳의 염분, 지하 수위 등을 계측할 수 있는 시스템을 구축하였다.

사용자 삽입 이미지

 센서는 총 28개의 초음파 수위계, 1개의 염분계, 1개의 유량계 등 30개로 구성되어 있고, 통신 방식은 장거리 통신에 유리한 RS-485 방식과 블루투스 무선 통신 방식을 겸용하였다.

개발 환경: Microsoft Visual Studio 2005, .NET Framework 2.0, C#, Crystral Report
주요 기능: c/s 방식, 수위, 유량, 염분 모니터링, 모니터링 주기 설정, 보고서 기능, 데이터 히스토리 기능 제공
크리에이티브 커먼즈 라이센스
Creative Commons License

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/135

Comments

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]

[MFC, C++, 2008] AnyloggerWing

2008/11/05 17:11
아마 회사에 입사한 이래로 나에게 맡겨진 가장 크고, 또 가장 긴 기간 (2008.01 ~ 현재) 동안 진행 중인 프로젝트다.

사용자 삽입 이미지

사용자 삽입 이미지
 어찌하다보니, 기획, 설계, 코딩까지 진행하느라... 개발에 착수하던 첫 한 달은 매일 야근에 시달렸었다. 그리고, 4월에 훈련소 들어가기 전까지 거의 이 녀석의 수정 및 optimize에 시달렸고... 지금까지 클라이언트의 요구에 따른 커스터마이즈 및 디버깅을 진행 중이다.

 이 프로그램은 우리 회사에서 개발 중인 무선 계측기인 Anylogger 전 모델과의 인터페이스를 제공하고, 계측기 제어 및 센서 출력, 실시간 분석 등을 지원한다.

개발 환경: Microsoft Visual Studio 6.0, Codejock Extreme Toolkit, Pro Essential 5.0

주요 기능: Anylogger 전 모델과 인터페이스 제공, 변형률 센서, 가속도 센서, 온도 센서 등 다양한 센서 지원, 모니터링 기능, 트리거 기능, 실시간 FFT 제공, 수식 편집 기능 제공
크리에이티브 커먼즈 라이센스
Creative Commons License

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/134

Comments

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]

 올해 여름 기간에 한국건설기술연구원과 연계하여 내가 개발한 삽교대교 모니터링 프로그램이 뉴스에 나왔다!-ㅁ- 기사 링크

 비록 공중파는 아니지만... YTN 뉴스에 소개되었는데... (화면에 잠깐 1초 정도 나옴..) 요 녀석 때문에 여름 휴가 때 부산 가서도 연구실에 찾아가 눈치보며, 프로그램을 개발했었더랬지.ㅠㅠ

사용자 삽입 이미지

사용자 삽입 이미지
개발 환경:
(1) 서버 프로그램: Microsoft Visual Studio 6.0, Codejock Extreme Toolkit, Pro Essential 5.0, mysql server 5.1 (commerical license)

(2) 클라이언트 프로그램: Microsoft Visual Studio 6.0, Codejock Extreme Tookit, Pro Essential 5.0, Crystal Report

주요 기능: 동경측기 TDS-302 장비 제어, MOI 인터로게이터 장비 제어, 센서 모니터링, 알람 기능, 트리거 기능, 보고서 작성 및 뷰 기능
크리에이티브 커먼즈 라이센스
Creative Commons License

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/133

Comments

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]

[C#] 메일 자동 발송 프로그램

2007/05/02 18:00
 하루에도 많게는 수백통씩 날아들어오는 스팸 메일의 시대에 살면서... 나 또한 그러한 범죄에 악용될 수 있는 프로그램을 만들어버렸다.

예전 아티클에도 나와있지만... 이번에도 회사 업무 차원에서 만들게 되었다. (그렇다고 우리 회사에서 스팸을 보내기 위해 만든 것이 아니다. 병역특례 관련해서 각 대학에 공문을 발송하기 위해 만들었다.)

이전과 달라진 점은...
SMTP를 설정하지 않아도 된다는 점이다. 왜냐하면 IIS를 설치하면 제공되는 ESMTP를 쓰기 때문이다.

따라서, 무료로 제공하는 SMTP를 찾기 위해 헤맬 필요가 없다. 자신 PC의 포트를 통해 발송하기 때문이다. 정확하게 기억은 안나지만.. 아마도 80번 포트?-ㅁ-; (기억이 안나는 이유는 2월쯤인가 만들었었다.)

급하게 부탁받아.. 하루 정도 걸려 만들었기 때문에, 자질구레한 예외는 가볍게(?) 무시해버린 센스를 발휘했다. 그래서, 무슨 버그가 발생할지 알 수 없다.

구현은 그 때와 마찬가지로 C#과 .NET Framework 2.0을 기반으로 했다.

주요기능
- 동일한 내용의 메일을 대량으로 발송
- 메일링 리스트 불러오기 및 저장 가능
- 메일링 리스트 추가, 삭제, 저장, 수정 가능
- 메일 내용 미리보기 기능(HTML로 작성된 메일을 브라우저에서 어떻게 보일까를 위해..)
- 첨부 파일 (용량 제한은 상대방 수신 메일 서버에서 허용하는 범위 만큼만)
- 메일 내용 불러오기 및 저장 가능
- 서명 첨부 가능
- 발송한 메일 로그 확인
[디자인적 측면은 전혀 고려하지 않은 유저 인터페이스]

[메일 내용 미리 보기]

비록 C#으로 구현하였지만.. Visual Studio 2005를 사용하는 사람이라면, C++, Visual Basic으로도 동일하게 구현가능하다.

부끄러워서 풀 소스 공개는 못하더라도.. 주요부분(ESMTP를 이용해 메일을 발신하는 부분 - 몇 줄 되지도 않고, 새로울 것도 없지만.. )은 공개 가능하다.

덧1) 이러한 포스트를 남기는 이유는.. 명색이 컴공 전공자로써.. 전공 얘기가 전무한 것이 부끄러버서 한거라고는 말 못함-ㅁ-

덧2) 회사에서 병역특례(전문연구요원)를 구하고 있음. 전공은 전산쪽 계열이며 가능함. (물론, 프로그래밍 가능자).. 덧붙이면 2007년 8월 졸업자에 한함. 관심있는 분들은 연락바람.
크리에이티브 커먼즈 라이센스
Creative Commons License

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/78

Comments

  1. 2007/05/03 11:29

    2008년 2월 졸업생도 싸게 구하실수 있다고.. 어케 말씀 전해바바바바~ ^^;;

    perm. |  mod/del. |  reply.
    • NOhungry 2007/05/03 12:54

      맹// ㅎㅎ 안타깝지만, 2008년 2월 졸업생은 내년을 기약해야겠지~ 이번 TO는 2007년에 소진시켜야 한다.ㅋ 안그럼, 내년에 TO가 안나오걸랑~

  2. 열정 2007/05/03 20:06

    내년부터 보충역 산업기능요원을 없애버린다는 소문이 있소 -_-
    이러다가 전문연구요원도 없어지는거 아닌가 몰라 ㅋㅋ

    perm. |  mod/del. |  reply.
    • NOhungry 2007/05/03 23:47

      음~ 전문연구요원은 그렇게 쉽게 없어지지 않을거야. 이공계 장려해야 하니깐.

  3. acaran 2007/05/04 22:18

    다음엔 자동 야근, 자동 주말특근 프로그램좀 하나 짜주게 ㅠ_ㅠ

    perm. |  mod/del. |  reply.
  4. 안재명 2007/07/27 09:47

    이거 소스가 어디있나염?? ^^

    perm. |  mod/del. |  reply.
  5. 가을아이 2007/08/21 15:25

    만드시 프로그램 보구 공부할려구 합니다... 소스 주실수 있으신지요...?

    perm. |  mod/del. |  reply.
    • NOhungry 2007/09/05 00:50

      안재명, 가을아이// 답글이 늦었습니다. 정말 죄송합니다.

      언젠가 따로 이 내용과 관련해 포스팅을 하고, 거기에 소스를 공개하려고 했는데, 귀차니즘으로 점점 미루어지고 있네여..

      맘같아서는 저 허접한 소스를 백방에 공개하고 싶습니다면, 현재로선 회사 업무용으로 사용되고 있어서 전체 소스 공개는 사실 불가능할 것 같네여. 죄송합니다.

  6. 비밀방문자 2008/02/13 15:34

    관리자만 볼 수 있는 댓글입니다.

    perm. |  mod/del. |  reply.

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]

우리는 근래에 자동 업데이트 프로그램에 둘러쌓여 산다.
Windows XP는 시도 때도 없이.. 새로운 패치가 나왔다고 자동 업데이트 하겠냐고 물어보고.-ㅁ-
카트라이더에 로그인 하면.. 알아서 새로운 버젼이 나왔다고 설치한다.

프로그램 개발자에게 있어 새로운 버젼이 나왔는데, 이걸 사용자에게 어떻게 전해주느냐는 중요한 문제다. 사실 사용자에게 새버젼이 나왔을 때 마다 전화해서 알려줄 수도 없으니..

자동 업데이트 프로그램.. 간지나는 디자인이 어디서 본 듯 하다.



내가 맹근 자동 업데이트 프로그램의 흐름은 심플하다.
프로그램을 실행시키면, 프로그램은 업그레이드 서버에 연결하고, 프로그램 내에 이식된 업데이트 체커는 프로그램의 현재 버젼을 읽어와 업그레이드 서버의 업그레이드 정보 파일(단순한 txt 파일)에서 읽은 버젼과 비교한다.

프로그램의 버젼 정보



비교한 결과, 현재 버젼보다 새로운 버젼이 존재하면.. 자동 업데이트 프로그램을 호출해 업그레이드 서버로부터 최신 파일들을 다운 받아 설치한다.

내가 구현한 자동 업데이트 프로그램의 스펙 및 개략적인 소개를 하면 다음과 같다.
(1) SmartUpdater.exe - C#으로 구현했으며, .NET Framework 2.0이 설치되어 있어야 돌아간다. (소스는 공개하지 않음.)
(2) UpdateCheck.h & UpdateCheck.cpp - 사실 이 소스는 내가 구현한 것이 아니라,  CodeProject란 곳의 Alexander Bischofberger란 아저씨가 구현한 소스를 내 입 맛에 맡게 약간의 수정을 거쳤다.
(3) UpdateChecker.exe - 앞 서 언급한 (1)과 (2)를 이용해 만든 예제 프로그램이다. (소스도 공개한다.)



UpdateCheck.h 파일을 열면 위 그림과 같다.

UpdateCheck.h


수정할 부분은 대략 IDS_UPDATE 부터 IDS_UPDATE_NO 정도까지가 되겠다.
IDS_UPDATE는 업그레이드 정보가 담긴 파일의 URL이다. 이 파일의 형식은 다음과 같다.


앞에 3과 4는은 Major Version과 Minor Version이다. 그러니까 내 프로그램의 버젼이 1.0.0.1 이라면 앞의 1과 0이 Major Version과 Minor Version이라 할 수 있다. 그리고 젤 마지막의 URL은 원래 원저작자는 업데이트 페이지로 연결하도록 구현하였는데, 난 그냥 업데이트 프로그램을 로딩시켜서 설치하도록 하였기 때문에, 마지막 URL은 의미가 없다. 그리고 각 항목의 구분자(delim)는 "|(\ 위에 있는 녀석)" 이다.

그 아래 IDS_UPDATE_AVAILABLE은 새로운 버젼을 찾았을 경우, 설치하겠냐고 묻는 문구이다. 그 이하는 읽어보면 대충 감이 올 것이다. (입맛에 맞게 바꾸도록 하자.)

아, 그리고 참고로 #include <wininet.h> 하면 링크 에러가 뜰 것이다-ㅁ-.. "wininet.lib version.lib" 녀석들을 참조하도록 해야된다.

UpdateCheck 사용


그리고, 실제 사용은.. MyProgramApp 내에 InitInstance() 함수 안에서 위의 내용을 써주면 된다. 이 때 _T("SmartUpdater.exe")는 내가 개발한 자동 업데이트 프로그램(업데이트를 위한 웹 서버에서 Update File List를 읽어와 Update File들을 Local PC로 다운로드 하는 역할을 함.)을 호출하는 부분이므로, 각자가 구현한 자동 업데이트 프로그램을 추가해주면 된다.

어떻게 자동 업데이트 프로그램을 구현하였는지는.. 다음 문서에서 자세히 소개하도록 할 예정이다. (전체 소스를 공개하지는 않지만.. 핵심 부분은 알 수 있다.)

모든 소스 코드를 공개하였습니다. 수정 및 재배포도 모두 허용합니다. 대신, 수정 요청이나 디버깅 요청은 사절입니다.

다운로드 : http://www.nohungry.net/Data/AutoUpdateChecker.zip
참조: http://www.codeproject.com/cpp/updatecheck.asp
크리에이티브 커먼즈 라이센스
Creative Commons License
TAG ,

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/34

Comments

  1. acaran 2006/09/21 11:18

    오~ 간지가 좔좔 흐르는 프로그램이구려~! 근데 혹시라도 업데이트 하는 그 프로그램 자체를 업데이트 할일이 생기면 어쩌는가?-_- 역시 몇가지 꽁수를 추가하는 수 밖에 없겠지? -_-

    perm. |  mod/del. |  reply.
  2. NOhungry 2006/09/21 11:28

    원래 그런걸 피하려면.ㅋ ActiveX로 맹글어서~ 웹에서 설치하도록 해야겠지.ㅋ
    근데 내 생각에는.. 업데이트 목록에 업데이트 된 업데이트 프로그램도 추가해놓고.ㅋ 같이 다운 받으면 되지 않겠나?ㅋㅋ

    perm. |  mod/del. |  reply.
  3. acaran 2006/09/21 19:27

    다운받으면 현재 파일이 열려 있어서 그냥 받으면 안될꺼 같은데-_- 파일명을 약간 다르게 하거나 다른 경로에 받은후, 재실행 되게 만들어서 그때 덮어쓰게 하면 되겠구려-_-

    perm. |  mod/del. |  reply.
  4. kwangho 2009/02/12 23:15

    smartclient 구동방식과 다른건가요?

    perm. |  mod/del. |  reply.
    • 노헝그리 2009/02/17 12:00

      스마트 클라이언트를 커스터마이징 했다고 보시면 되겠습니다..^^;

  5. 컴매니아  2009/04/20 11:07

    안녕하세요.. 이번에 자동업데이트 부분을 구현하려고 하는데 자료가 없어 여기저기

    검색하다가 오게 되었습니다.

    그런데.. 링크가 깨져 있군요.. 혹시 메일로 보내주실수 있을까요? kbgyhy@naver.com으로

    괜찮다면 부탁드립니다.

    perm. |  mod/del. |  reply.
  6. 명랑한 2009/05/19 11:44

    안녕하세요..

    저도 요즘 자동업데이트 관련 자료를 찾고있었는데.

    다운로드 받는 링크가 깨져있네요, 제게도 가능하시면 보내주세요

    chungi68@hanmail.net

    perm. |  mod/del. |  reply.
  7. 김철령 2009/07/14 15:13

    포스트에 언급하신 자동 업데이트 기능을 구현중에 있는데요..
    몇일밤을 꼬박 세우며 작업하고 있는데, 잘 되지 않네요... ㅠ.ㅠ
    링크가 깨져 있어서요!!.. 소스를 전달해 주시면 감사 하겠습니다.
    소스 참조, 성능 개선 시켜 다시 전달해 드릴 것을 꼭 약속 드립니다.
    ican2727x@gmail.com

    perm. |  mod/del. |  reply.
    • 노헝그리 2009/07/15 14:28

      제가 블로그를 거의 관리 안하다보니-_-;

      어쨌든 소스 코드는 보내 드렸습니다~;

      뭐 매우 심플한 업데이터라 상용으로 쓰고자 하신다면~ 손을 많이

      보셔야 됩니다.

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]