실행중인 어셈블리 버전을 얻으려면 어떻게해야합니까?


169

다음 코드를 사용하여 C # 3.0에서 실행중인 어셈블리 버전을 얻으려고합니다.

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];

그렇게하는 또 다른 적절한 방법이 있습니까?

답변:


293

응용 프로그램 유형에 관계없이 항상 호출 할 수있는 두 가지 옵션 :

Assembly.GetExecutingAssembly().GetName().Version

경우 윈도우 폼 응용 프로그램을 제품 버전을 위해 특별히 찾고 있다면, 당신은 항상 응용 프로그램을 통해 액세스 할 수 있습니다.

Application.ProductVersion

GetExecutingAssembly어셈블리 참조에 사용 하는 것이 항상 옵션은 아닙니다. 따라서 개인적으로 기본 어셈블리 또는 어셈블리 버전을 참조 해야하는 프로젝트에서 정적 도우미 클래스를 만드는 것이 유용하다는 것을 알았습니다.

// A sample assembly reference class that would exist in the `Core` project.
public static class CoreAssembly
{
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly;
    public static readonly Version Version = Reference.GetName().Version;
}

그런 다음 CoreAssembly.Version필요에 따라 코드를 깨끗하게 참조 할 수 있습니다 .


7
ClickOnce와 함께 배포 된 경우 다음을 확인해야합니다.System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan

흥미로운 점 : 실제 버전을 어디에 지정해야합니까? 내 AssemblyInfo.cs에 AssemblyVersion 및 AssemblyFileVersion을 지정했으며 위의 메서드 호출에서 얻을 수있는 모든 항목은 다음과 같습니다. 1.0.0
AgentKnopf

@Zainodis @Justin이 ClickOnce언급 한 버전을 참조하는 경우 Publish프로젝트 속성 내의 탭에 지정됩니다 (즉, AssemblyVersion 또는 AssemblyFileVersion과 관련이 없음).
Chris Baxter

@CalgaryCoder 응답에 감사드립니다 .ClickOnce가 무엇인지 모르지만 VS를 통해 AssemblyInfo 파일을 편집 할 때 갑자기 작동했습니다. 텍스트 편집기에서 AssemblyInfo.cas를 수동으로 편집하면 모든 필드가 비워집니다. 어느 쪽이든, 그것은 지금 해결되었습니다 :)
AgentKnopf

7
시작 컨텍스트로 인해 ASP.NET MVC 앱에서는 작동하지 않습니다. 해결 방법은 HomeControllerRazor에서 웹 사이트 어셈블리의 알려진 유형 (예 : 유비쿼터스 MVC)을 참조하는 것입니다 .v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack

38

MSDN의 Assembly.GetExecutingAssembly 메서드 는 "getexecutingassembly"메서드에 대한 설명입니다. 성능상의 이유로 디자인 타임에 현재 실행중인 어셈블리를 모르는 경우에만이 메서드를 호출해야합니다.

현재 어셈블리를 나타내는 Assembly 개체를 검색하는 권장 방법 Type.Assembly은 어셈블리에서 찾은 유형 의 속성 을 사용하는 것 입니다.

다음 예는 다음을 보여줍니다.

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        Console.WriteLine("The version of the currently executing assembly is: {0}",
                          typeof(Example).Assembly.GetName().Version);
    }
}

/* This example produces output similar to the following:
   The version of the currently executing assembly is: 1.1.0.0

물론 이것은 도우미 클래스 "public static class CoreAssembly"의 답변과 매우 유사하지만 적어도 한 가지 유형의 실행 어셈블리를 알고있는 경우 도우미 클래스를 반드시 만들어야하는 것은 아니며 시간을 절약 할 수 있습니다.


19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx의 설명 :

GetEntryAssembly방법은 반환 할 수 null어셈블리를 관리하는이 관리되지 않는 응용 프로그램에서로드 된 경우. 예를 들어 관리되지 않는 응용 프로그램이 C #으로 작성된 COM 구성 요소의 인스턴스를 만드는 경우 프로세스의 진입 점이 관리되는 어셈블리가 아닌 관리되지 않는 코드이므로 GetEntryAssemblyC # 구성 요소에서 메서드를 호출하면이 반환 null됩니다.


2
+1. GetEntryAssembly(vs GetCallingAssembly또는 GetExecutingAssembly)는 참조 라이브러리 내에서 호출 할 때 작동하는 유일한 것으로 보입니다.
drzaus 2014 년

6

이것은해야합니다 :

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();

5
이 세 줄은 1이 될 수 있습니다. return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre


1

Product Version GitVersion 또는 다른 버전 관리 소프트웨어를 통해 버전 관리를 사용하는 경우 선호 될 수 있습니다.

클래스 라이브러리 내에서 이것을 얻으려면 다음을 호출하십시오 System.Diagnostics.FileVersionInfo.ProductVersion.

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.