[C#] Version 자동 설정 및 BuildDateTime 구하기


Assembly의 Build된 일시를 구하기 위한 방법을 설명 드립니다.

  1. 먼저 [Properties] 폴더에 [AssemblyInf.cs]를 엽니다.
  2. 다음과 같은 부분을 찾습니다. 보통 최 하단에 위치하고 있습니다.
    1 // You can specify all the values or you can default the Revision and Build Numbers
    2 // by using the '*' as shown below:
    3 [assembly: AssemblyVersion("1.0.0.0")]
    4 [assembly: AssemblyFileVersion("1.0.0.0")]
  3. 주석 문구와 같이 버전의 정보를 사용자가 직접 설정할 수도 있고, 자동으로 설정되도록 할 수 있습니다. 자동으로 설정되도록 하기 위해 아래와 같이 변경합니다.

    1 // You can specify all the values or you can default the Revision and Build Numbers
    2 // by using the '*' as shown below:
    3 [assembly: AssemblyVersion("1.0.*")]
    4 [assembly: AssemblyFileVersion("1.0.*")]
  4. AssemblyVersion을 자동으로 설정되도록 하면, Build된 일시 정보를 바탕으로 Version Text값을 생성됩니다.  실제 생성되는 Version Text는 아래의 구조를 가집니다.
    1 //Version=MajorVersion.MinorVersion.BuildNumber.RevisionNumber
    2 //BuildNumber는 2000년 1월 1일을 기준으로 Build된 날짜까지의 총 일수로 설정됩니다.
    3 //RevisionNumber는 자정을 기준으로 Build된 시간까지의 지나간 초(Second) 값으로 설정됩니다.
    4 Version=1.0.4122.21378
  5. 위와 같이 공식을 알았으니 이제, Version Text를 읽어서 DateTime으로 변환해 봅시다!
    01 /// <summary>
    02 /// Version Text로부터 Build된 일시를 구합니다.
    03 /// </summary>
    04 /// <returns></returns>
    05 public DateTime getBuildDateTime()
    06 {
    07     //1. Assembly.GetExecutingAssembly().FullName의 값은
    08     //'ApplicationName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
    09     //와 같다.
    10     string strVersionText = Assembly.GetExecutingAssembly().FullName
    11             .Split(',')[1]
    12             .Trim()
    13             .Split('=')[1];
    14
    15     //2. Version Text의 세번째 값(Build Number)은 2000년 1월 1일부터
    16     //Build된 날짜까지의 총 일(Days) 수 이다.
    17     int intDays = Convert.ToInt32(strVersionText.Split('.')[2]);
    18     DateTime refDate = new DateTime(2000, 1, 1);
    19     DateTime dtBuildDate = refDate.AddDays(intDays);
    20
    21     //3. Verion Text의 네번째 값(Revision NUmber)은 자정으로부터 Build된
    22     //시간까지의 지나간 초(Second) 값 이다.
    23     int intSeconds = Convert.ToInt32(strVersionText.Split('.')[3]);
    24     intSeconds = intSeconds * 2;
    25     dtBuildDate = dtBuildDate.AddSeconds(intSeconds);
    26
    27
    28     //4. 시차조정
    29     DaylightTime daylingTime = TimeZone.CurrentTimeZone
    30             .GetDaylightChanges(dtBuildDate.Year);
    31     if (TimeZone.IsDaylightSavingTime(dtBuildDate, daylingTime))
    32         dtBuildDate = dtBuildDate.Add(daylingTime.Delta);
    33
    34
    35     return dtBuildDate;
    36 }

아, 물론 Assembly 파일자체의 작성시간을 통해 BuildDate를 구하는 방법도 있습니다.

1 /// <summary>
2 /// Assembly의 Build된 일시를 구합니다.
3 /// </summary>
4 /// <returns></returns>
5 public DateTime getBuildDateTime()
6 {
7     Assembly assembly = Assembly.GetExecutingAssembly();
8     return System.IO.File.GetLastWriteTime(assembly.Location);
9 }

답글 남기기

이메일 주소는 공개되지 않습니다.