프로그래밍 방식으로 DLL의 버전 번호 가져 오기


151

.NET DLL에서 프로그래밍 방식으로 버전 번호를 얻을 수 있습니까?

그렇다면 어떻게?


10
이것이 6 분 전에 요청되었다는 것을 믿을 수 없으며, 단지 똑같은 것을 묻고있었습니다!
tpower

2

답변:


119
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;

중요 : 이것은 원래 질문에 대한 최선의 답변이 아니라는 점에 유의해야합니다. 이 페이지에서 자세한 내용을 읽으십시오.


28
MyAssembly.dll을 실행중인 AppDomain ... 나쁜 아이디어로로드합니다.
staafl

12
Assemblyname.GetAssemblyName이러한 문제를 피하는 것이 좋습니다
staafl

7
appdomain에 어셈블리를로드하면 속도가 느려지고 되돌릴 수 없으며 (도메인을 종료하지 않고 언로드 할 수 없음) 권한이 필요하며 beforefieldinit유형 초기화 프로그램 실행과 같은 부작용을 일으킬 수 있으므로이 경우에는 필요하지 않습니다. 이러한 이유가 충분합니까?
staafl

7
@staafl : 예; 저뿐만 아니라 앞으로이 페이지를 읽는 다른 사람들에게도 도움이됩니다.
Kris

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersion작업을 잘 수행하고 dll을 응용 프로그램에로드하지 않습니다.
Jack

181

dll이 .net 또는 Win32 인 경우 작동합니다 . 리플렉션 방법은 dll이 .net 인 경우에만 작동합니다. 또한 리플렉션을 사용하면 전체 dll을 메모리에로드하는 오버 헤드가 있습니다. 아래 방법은 어셈블리를 메모리에로드하지 않습니다.

// Get the file version.
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\MyAssembly.dll");

// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' +
                  "Version number: " + myFileVersionInfo.FileVersion);

보낸 사람 : http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx

원본 출처


5
나는 이것을 좋아한다. dll을로드하는 것을 귀찮게하고 리플렉션을 사용하여 버전을 가져 오는 이유는 무엇입니까?
aggieNick02

@ben, 게시물을 편집 할 수 있습니까? 나는 downvote를 추가하여 -1 담당자를 잃어버린 것을 보았습니다. 게시물을 수정하지 않으면 변경할 수 없습니다. 건배!
Luke Duddridge

9
당신이 만드는하려는 경우 반드시 얻을 실행 파일 / dll을 실제로 현재 사용 : 대신 정적 파일 이름 (의 @"C:\MyAssembly.dll"위), 당신이 사용할 수있는 System.Reflection.Assembly.GetExecutingAssembly().Location(또는 DLL의 경우 : Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
콘래드

4
AssemblyVersion과 AssemblyFileVersion 특성의 차이점입니다. AssemblyFileVersion은 Windows API가 값을 가져올 수있는 방식으로 스탬프 처리됩니다. AssemblyVersion은 강력한 이름의 일부이며 AssemblyFileVersion과 반드시 ​​같을 필요는 없습니다.
daughey 2012

51

우선, 관심을 가질만한 두 가지 가능한 '버전'이 있습니다.

  • 모든 실행 파일에 적용 가능한 Windows 파일 시스템 파일 버전

  • 컴파일러가 .NET 어셈블리에 포함하는 어셈블리 빌드 버전 (분명히 .NET 어셈블리 dll 및 exe 파일에만 해당)

전자의 경우 Ben Anderson의 답변을 사용해야합니다. 후자의 경우 AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version어셈블리가 코드에서 참조되는 경우, 또는 Tataro의 답변을 사용하십시오.

.Load()/ .LoadFrom()메소드 를 사용하는 모든 답변을 무시할 수 있습니다.이 방법은 실제로 현재 AppDomain에 어셈블리를로드하기 때문에 트리를 자르는 것과 비슷합니다.


32

다음은 약간의 리플렉션을 사용하여 특정 클래스를 포함하는 DLL 버전을 얻는 좋은 방법입니다.

var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;

그냥 클래스를 교체하십시오! 버전을 얻으려는 DLL에 정의 된 클래스 이름으로.

다른 배포에 대해 DLL을 이동하면 파일 경로를 변경할 필요가 없기 때문에 이것이 내가 선호하는 방법입니다.


3
문제의 어셈블리가 현재 어셈블리에서 정적으로 참조되는 경우에만 작동합니다.
staafl

2
DLL은 반드시 엔트리 어셈블리 일 필요는 없기 때문에 이것이 가장 좋은 해답입니다.이 어셈블리가 호출 된 어셈블리 일지라도
CAD

1
다양한 유형의 버전 정보를 얻으 려면 stackoverflow.com/a/909583/492 를 참조하십시오 . 예 :FileVersionInfo
CAD bloke

22

시작된 어셈블리 (윈폼, 콘솔 앱 등)를 얻으려면

using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version

6
GetExecutingAssembly ()도 도움이 될 수 있습니다.
Bolt Thunder

10

Kris, 실제 DLL 파일에서 어셈블리를로드해야 할 때 (그리고 DLL이있는 경우) 버전이 훌륭하게 작동하지만 DLL이 EMBEDDED 인 경우 (예 : 파일이 아니라 포함 된 경우) 원치 않는 오류가 발생합니다 DLL).

다른 하나는 " 1.2012.0508.0101 " 과 같은 버전 관리 체계를 사용하는 경우 버전 문자열을 가져 오면 실제로 " 1.2012.518.101 "이됩니다. 누락 된 0을 확인하십시오 .

따라서 다음은 DLL 버전 (내장 또는 DLL 파일)을 가져 오는 몇 가지 추가 기능입니다.

    public static System.Reflection.Assembly GetAssembly(string pAssemblyName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyName)) { return tMyAssembly; }
        tMyAssembly = GetAssemblyEmbedded(pAssemblyName);
        if (tMyAssembly == null) { GetAssemblyDLL(pAssemblyName); }

        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if(string.IsNullOrEmpty(pAssemblyDisplayName)) { return tMyAssembly; }
        try //try #a
        {
            tMyAssembly = System.Reflection.Assembly.Load(pAssemblyDisplayName);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName)


    public static System.Reflection.Assembly GetAssemblyDLL(string pAssemblyNameDLL)
    {
        System.Reflection.Assembly tMyAssembly = null;

        if (string.IsNullOrEmpty(pAssemblyNameDLL)) { return tMyAssembly; }
        try //try #a
        {
            if (!pAssemblyNameDLL.ToLower().EndsWith(".dll")) { pAssemblyNameDLL += ".dll"; }
            tMyAssembly = System.Reflection.Assembly.LoadFrom(pAssemblyNameDLL);
        }// try #a
        catch (Exception ex)
        {
            string m = ex.Message;
        }// try #a
        return tMyAssembly;
    }//System.Reflection.Assembly GetAssemblyFile(string pAssemblyNameDLL)


    public static string GetVersionStringFromAssembly(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssembly(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionString(Version pVersion)
    {
        string tVersion = "Unknown";
        if (pVersion == null) { return tVersion; }
        tVersion = GetVersionString(pVersion.ToString());
        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionString(string pVersionString)
    {
        string tVersion = "Unknown";
        string[] aVersion;

        if (string.IsNullOrEmpty(pVersionString)) { return tVersion; }
        aVersion = pVersionString.Split('.');
        if (aVersion.Length > 0) { tVersion = aVersion[0]; }
        if (aVersion.Length > 1) { tVersion += "." + aVersion[1]; }
        if (aVersion.Length > 2) { tVersion += "." + aVersion[2].PadLeft(4, '0'); }
        if (aVersion.Length > 3) { tVersion += "." + aVersion[3].PadLeft(4, '0'); }

        return tVersion;
    }//string GetVersionString(Version pVersion)


    public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyEmbedded(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)


    public static string GetVersionStringFromAssemblyDLL(string pAssemblyDisplayName)
    {
        string tVersion = "Unknown";
        System.Reflection.Assembly tMyAssembly = null;

        tMyAssembly = GetAssemblyDLL(pAssemblyDisplayName);
        if (tMyAssembly == null) { return tVersion; }
        tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString());
        return tVersion;
    }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName)

2
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);

2

@Ben의 답변이 저에게 유용하다는 것이 입증되었습니다. 그러나 소프트웨어에서 발생하는 주요 증가와 의미 버전 관리에 따라 제품 버전을 확인해야했습니다.

myFileVersionInfo.ProductVersion

이 방법은 나의 기대에 부응했다

업데이트 : 프로그램에서 dll 경로를 명시 적으로 언급하는 대신 (생산 버전에서 필요에 따라) Assembly를 사용하여 제품 버전을 얻을 수 있습니다.

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location); 
string ProdVersion= fileVersionInfo.ProductVersion;

참고 : 버전에 자동 증분 값에 별표가 포함 된 경우이 방법은 실제 생성 된 수 대신 별표를 반환합니다 (예 : 어셈블리 정보에 1.0. *를 입력하면 작동하지 않음).
Ronen Ness

예! 그러나 버전 업그레이드를 위해 Jeniks 자동화를 선택 했으므로 어셈블리에는 항상 dll 버전의 완벽한 조합이 있습니다.
Prasan Dutt

1

System.Reflection.Assembly.Load * () 메서드를 사용한 다음 AssemblyInfo를 가져올 수 있습니다.


0

원래 질문이 웹 서비스에만 국한된 것은 아니지만 다음은 웹 서비스 캐시되지 않은 응답과 파일 버전을 표시하기 위해 추가 할 수있는 완전한 testWebService입니다. 우리는 버전을 알고 싶어하기 때문에 어셈블리 버전 대신 파일 버전을 사용하지만 모든 어셈블리 버전이 1.0.0.0 인 경우 웹 사이트를 쉽게 패치 할 수 있습니다 (서명 및 요구 링크가 여전히 활성화되어 있습니다!). @ Class @를이 서비스에 포함 된 웹 API 컨트롤러의 이름으로 바꿉니다. 웹 서비스에 대한 정보와 빠른 버전 확인에 적합합니다.

  [Route("api/testWebService")]
  [AllowAnonymous]
  [HttpGet]
  public HttpResponseMessage TestWebService()
  {
      HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK);
      string loc = Assembly.GetAssembly(typeof(@Class@)).Location;
      FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc);
      responseMessage.Content = new StringContent($"<h2>The XXXXX web service GET test succeeded.</h2>{DateTime.Now}<br/><br/>File Version: {versionInfo.FileVersion}");
      responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
      Request.RegisterForDispose(responseMessage);
      return responseMessage;
  }

또한 익명으로 구성하기 위해 구성에서 web.config에 다음을 추가해야한다는 것을 알았습니다.

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.