일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 | 30 |
Tags
- WPF
- dotNET
- coding-test
- windows
- Visual Studio
- tls
- chashtag
- Binding
- convert
- mysql
- Github
- Microsoft
- 코딩테스트
- commit
- C#
- log
- Coding
- IValueConverter
- File
- Process
- programmers
- string
- git
- ListView
- csharp
- logging
- algorithm
- nullable
- .net
- windows10
Archives
- Today
- Total
CHashtag
[C#] Assembly 버전 정보 얻기, 버전 비교하기 (Compare Assembly Version) (함수 내부 동작원리) 본문
C#
[C#] Assembly 버전 정보 얻기, 버전 비교하기 (Compare Assembly Version) (함수 내부 동작원리)
HyoSeong 2021. 2. 16. 00:16반응형
안녕하세요.
오늘은 프로젝트의 어셈블리 버전 가져오는 법과 버전과 버전을 비교하는 방법에 대해 알아보도록 하겠습니다.
저는 처음에 숫자와 점(.)으로 분리된 버전을 어떻게 비교하여야 하나 잠깐 고민했었는데요, 다행히도 C#에서 버전 간의 비교 기능을 제공하여 해당 기능을 사용하여 버전을 비교해 보도록 하겠습니다
현재 어셈블리(Assembly) 버전 정보 얻기
// using System.Reflection;
public void Main()
{
AssemblyName assemblyName = Assembly.GetExecutingAssembly().GetName();
Version assemblyVersion = assemblyName.Version;
}
어셈블리(Assembly) 버전 비교하기
어셈블리 버전을 비교하는 방법은 크게 2가지가 있습니다. (사실 거의 동일한 기능입니다.)
1. version.CompareTo 사용하기
2. Version operator (==, <=,,,) 사용하기
1. public int CompareTo(Version value);
CompareTo 함수는 자기 자신과 인자로 받은 Version을 비교하여 Int32를 반환해주고 반환 값은 아래와 같습니다.
사용 방법은 다음과 같습니다.
// using System.Reflection;
public void Main()
{
AssemblyName name = Assembly.GetExecutingAssembly().GetName();
Version myVersion = name.Version;
// myVersion : 1.0.0.0
Version yourVersion = new Version("1.0.0.0");
int compareResult = myVersion.CompareTo((object)yourVersion);
// yourVersion : 2.0.0.0 -> -1
// yourVersion : 0.1.0.0 -> 1
// yourVersion : 1.0.0.0 -> 0
if(compareResult > 0)
{
if(compareResult == null)
{
Console.WriteLine("null");
}
else
{
Console.WriteLine("이후 버전");
}
} else if(compareResult < 0)
{
Console.WriteLine("이전 버전");
} else
{
Console.WriteLine("같은 버전");
}
}
2. public static bool operator ==(Version v1, Version v2); - 비추천
두 번째 방법은 연산자를 사용하여 크기를 비교하는 것입니다.
// using System.Reflection;
public void Main()
{
AssemblyName name = Assembly.GetExecutingAssembly().GetName();
Version myVersion = name.Version;
// myVersion : 1.0.0.0
Version yourVersion = new Version("1.0.0.0");
if(myVersion != null || yourVersion != null)
{
// null check를 해주지 않고 비교하려 하면 ArgumentNullException이 발생한다.
Console.WriteLine("null");
}
else if (myVersion < yourVersion)
{
Console.WriteLine("이후 버전");
}
else if (myVersion > yourVersion)
{
Console.WriteLine("이전 버전");
}
else
{
Console.WriteLine("같은 버전");
}
}
하지만 이 연산자는 내부적으로 CompareTo 함수를 호출합니다.
아래 코드는 실제 Version Class의 함수 일부분입니다.
따라서 한 번만 호출할 것이 아니라면 CompareTo를 사용하는 것을 권장드립니다.
// https://referencesource.microsoft.com/#mscorlib/system/version.cs
public static bool operator ==(Version v1, Version v2)
{
if (Object.ReferenceEquals(v1, null))
{
return Object.ReferenceEquals(v2, null);
}
return v1.Equals(v2);
}
public static bool operator !=(Version v1, Version v2)
{
return !(v1 == v2);
}
public static bool operator <(Version v1, Version v2)
{
if ((Object)v1 == null)
throw new ArgumentNullException("v1");
Contract.EndContractBlock();
return (v1.CompareTo(v2) < 0);
}
public static bool operator <=(Version v1, Version v2)
{
if ((Object)v1 == null)
throw new ArgumentNullException("v1");
Contract.EndContractBlock();
return (v1.CompareTo(v2) <= 0);
}
public static bool operator >(Version v1, Version v2)
{
return (v2 < v1);
}
public static bool operator >=(Version v1, Version v2)
{
return (v2 <= v1);
}
이처럼 내부 동작 방식을 이해한다면 더 효율적을 프로그래밍을 할 수 있습니다.
.net framework 코드를 확인할 수 있는 방법은 다음에 소개해 드리도록 하겠습니다.
전체 코드는 아래 링크에서 확인하실 수 있습니다.
https://github.com/Hyo-Seong/CHashtag/tree/master/GetAssemblyInfo
감사합니다.
반응형
'C#' 카테고리의 다른 글
[C#] DateTime to TimeStamp, TimeStamp to DateTime 변환하기 (1) | 2021.02.16 |
---|---|
[C#] .net framework, wpf 등 프레임워크 실제 동작 코드 보는 방법 (0) | 2021.02.16 |
[C#] 다른 프로세스가 파일 사용중인지 확인하기 (Check File Lock) (0) | 2021.02.08 |
[C#] 압축, 압축 풀기 (zip, unzip) (2) | 2021.02.05 |
[C#] 파일 읽기, 저장하기 (UTF8) (0) | 2021.01.26 |