C# 프로그램 자동 업데이트 구현

  안녕하세요? 혼살입니다. 이번 포스트는 C#과 웹서버, PowerShell script를 사용한 아주 간단한 자동 업데이트 구현 방법을 알려드리겠습니다.



  우선, 이전 포스트를 참고해 버전 정보를 자동으로 텍스트파일에 써주시고, 그 텍스트 파일을 웹서버에 올려줍니다. 애초에 텍스트 파일을 바로 웹서버 디렉터리에 써주시면 더 편하겠죠?

  그리고 매우 간단한 버전 체크 메소드를 하나 만들어주세요.
private static void CheckVersion()
{
    var filename = System.Reflection.Assembly.GetExecutingAssembly().Location;
    var version = System.Diagnostics.FileVersionInfo.GetVersionInfo(filename).FileVersion;

    var req = HttpWebRequest.CreateHttp("http://honsal.dyndns.info:8008/version.txt");

    using (var res = req.GetResponse())
    {
        using (var stream = res.GetResponseStream())
        {
            using (var reader = new StreamReader(stream))
            {
                var remoteVersion = reader.ReadLine().TrimEnd();

                if (version != remoteVersion)
                {
                    Update();
                }
            }
        }
    }
}

filename: 현재 응용 프로그램 경로(확장자까지)
version: 현재 응용 프로그램 버전(string)
req: 웹 서버에 연결해 버전 정보르르 받아올 HttpWebReqeust 객체
res: req의 응답
stream: res의 응답 스트림
reader: 스트림 리더
remoteVersion: 웹 서버의 버전 정보(string)

  웹 서버의 버전 정보와 현재 버전 정보가 다르다면 Update를 실행합니다. 그리고 Update 부분은

private static void Update()
{
    Process.Start("powershell.exe",
@"-COMMAND DEL SELF_UPDATE_TUTORIAL.EXE
Invoke-WebRequest -Uri ""http://honsal.dyndns.info:8008/SELF_UPDATE_TUTORIAL.exe"" -OutFile ""SELF_UPDATE_TUTORIAL.EXE""");
    Environment.Exit(0);
}

  코드 순서상은 파워쉘이 먼저 실행되는 것처럼 보이지만, 시간상 Environment.Exit(0);이 먼저 실행되어 응용 프로그램이 종료되고, 그 후 PowerShell이 열려 현재 응용 프로그램을 삭제한 뒤 웹 서버의 업데이트된 응용 프로그램을 받아 저장합니다.

  참 쉽죠?

댓글

  1. 안녕하세요. 좋은글 잘 봤습니다.
    문의할게 있습니다. 일단 파워쉘이 관리자 권한으로 실행이 안되서 기존 exe파일 삭제시 퍼미션 오류가 났습니다.
    그리고 Environment.Exit(0); 부분에 System.ComponentModel.Win32Exception: '창 핸들을 만드는 동안 오류가 발생했습니다.' 이 에러가 나타납니다 ㅠㅠ

    답글삭제
  2. 링크해갑니다~

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭