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를 반환해주고 반환 값은 아래와 같습니다.

https://docs.microsoft.com/ko-kr/dotnet/api/system.version.compareto?view=net-5.0

 

사용 방법은 다음과 같습니다.

 

// 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

 

Hyo-Seong/CHashtag

https://chashtag.tistory.com/. Contribute to Hyo-Seong/CHashtag development by creating an account on GitHub.

github.com

 

 

감사합니다.

반응형