상세 컨텐츠

본문 제목

c# 빌드시점 확인 및 사용기간 제한 (만료일자) 넣기

개발이야기/C or C++ 언어 관련

by mycatdid0 2022. 4. 8. 15:14

본문

반응형

(포스팅 2022.02.16)

 

프로그램 제작시, 바이너리의 사용기간을 제한하고 싶을 때가 있습니다.
업무용 프로그램 배포시에 첫 배포는 그럭저럭 잘 되지만, 이후에 갱신용 배포를 할 때는 사용자들이 업데이트를 잘 하지 않는 경우가 있습니다.
개발이 진행될 수록 각 버전간의 차이가 발생하여 업무에 혼선이 커지게 됩니다.

 

이를 방지하기 위하여, 바이너리 생성시에 사용기간을 제한합니다.
업데이트를 하지 않은 사용자에게서 '프로그램이 동작하지 않아요'라고 연락오면,
"제가 새 버전을 배포했는데 업데이트를 하지 않으셨네요"
라고 말하면서 갱신된 버전을 전달하면 됩니다.

 

C 에서는 __DATE__ __TIME__ 이라는, 빌드시점을 알 수 있는 문자열이 있었습니다만 C# 에는 없습니다.
아무리 찾아도 방법이 없어서, 다음의 방법으로 빌드시점을 넣었습니다.

  • 빌드시점을 소스코드로 만드는 스크립트를 준비한다.
  • 빌드할때마다 해당 스크립트를 실행하여, 빌드시점이 소스코드에 포함되도록 한다.

다음은 빌드시점을 표시하는 소스코드입니다.
'프로그램네임스페이스' 에 자신이 사용하는 namespace 를 넣으세요.

1
2
3
4
5
6
7
8
9
10
11
// FILE : BuildDate.cs
namespace 프로그램네임스페이스
{        
    internal class BuildDate        
    {        
        static public string str =        
            "2022-02-16_13:56:05.78";    // 자동으로 업데이트할 문자열        
        static public System.DateTime time;        
    }        
}        
 
cs

다음은 빌드시점을 갱신하는 스크립트입니다.

1
2
3
4
5
6
7
8
9
10
11
12
:: FILE : update_date.bat
 
echo namespace 프로그램네임스페이스 > BuildDate.cs
echo {        >> BuildDate.cs
echo     internal class BuildDate        >> BuildDate.cs
echo     {        >> BuildDate.cs
echo         static public string str =        >> BuildDate.cs
echo             ^"%date%_%time%^";        >> BuildDate.cs
echo         static public System.DateTime time;        >> BuildDate.cs
echo     }        >> BuildDate.cs
echo }        >> BuildDate.cs
 
cs

해당 파일을 update_date.bat로 저장합니다.
실행될때마다 BuildDate.cs 파일의 시간문자열을 갱신하게 됩니다.

아래와 같이 프로젝트에 포함시킵니다.

빌드타임 갱신용 스크립트를 추가합니다.
아래와 같이 '프로젝트 속성 -> 빌드이벤트 -> 빌드전 이벤트' 로 진입하여 스크립트를 입력해 줍니다.

여기까지 진행하시고 빌드해보시면, 빌드를 할 때마다 BuildTime 이 갱신됩니다.
소스코드에 변경사항이 없는 상태에서 빌드 날자를 갱신하시려면 '다시 빌드'를 해 보세요.

 

프로그램의 시작점에, 빌드시간 후 얼마나 지났는지를 체크하는 코드를 넣어 줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FILE : Program.cs
 
        static void Main()
        {
            // 빌드시 자동갱신되는 BuildDate.cs 의 문자열을 해석하여 빌드시점을 확인한다.
            // 문자열 예제 : "2022-02-16_13:44:15.22"
            char[] sperator = new char[] { '\t''-''_'':''.' };
            int[] values = new int[6]; // 년, 월, 일, 분, 시, 초
            int pos = 0;
            foreach (string str in BuildDate.str.Split(sperator))
            {
                values[pos] = Convert.ToInt32(str);
                pos++;
 
                if (pos >= values.Length) break;
            }
            BuildDate.time = new DateTime(values[0], values[1], values[2], values[3], values[4], values[5]);
 
            // 기간제한 60일
            TimeSpan diffTime = DateTime.Now - BuildDate.time;
            if (diffTime.TotalDays > 60return;
 
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm00());
        }
cs

소스코드 내에선 다음과 같은 식으로 빌드시점을 참조할 수 있습니다.

1
textBox.Text += "(c) TTT-System. Build:" + BuildDate.time.ToString("yyMMdd_HHmmss"+ Environment.NewLine;
cs

포스팅은 여기까지입니다.
감사합니다.

반응형

관련글 더보기

댓글 영역