.NET DLL에서 프로그래밍 방식으로 버전 번호를 얻을 수 있습니까?
그렇다면 어떻게?
.NET DLL에서 프로그래밍 방식으로 버전 번호를 얻을 수 있습니까?
그렇다면 어떻게?
답변:
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;
중요 : 이것은 원래 질문에 대한 최선의 답변이 아니라는 점에 유의해야합니다. 이 페이지에서 자세한 내용을 읽으십시오.
Assemblyname.GetAssemblyName이러한 문제를 피하는 것이 좋습니다
beforefieldinit유형 초기화 프로그램 실행과 같은 부작용을 일으킬 수 있으므로이 경우에는 필요하지 않습니다. 이러한 이유가 충분합니까?
FileVersionInfo.GetVersionInfo("foo.dll").FileVersion작업을 잘 수행하고 dll을 응용 프로그램에로드하지 않습니다.
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
@"C:\MyAssembly.dll"위), 당신이 사용할 수있는 System.Reflection.Assembly.GetExecutingAssembly().Location(또는 DLL의 경우 : Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
우선, 관심을 가질만한 두 가지 가능한 '버전'이 있습니다.
모든 실행 파일에 적용 가능한 Windows 파일 시스템 파일 버전
컴파일러가 .NET 어셈블리에 포함하는 어셈블리 빌드 버전 (분명히 .NET 어셈블리 dll 및 exe 파일에만 해당)
전자의 경우 Ben Anderson의 답변을 사용해야합니다. 후자의 경우 AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version어셈블리가 코드에서 참조되는 경우, 또는 Tataro의 답변을 사용하십시오.
.Load()/ .LoadFrom()메소드 를 사용하는 모든 답변을 무시할 수 있습니다.이 방법은 실제로 현재 AppDomain에 어셈블리를로드하기 때문에 트리를 자르는 것과 비슷합니다.
다음은 약간의 리플렉션을 사용하여 특정 클래스를 포함하는 DLL 버전을 얻는 좋은 방법입니다.
var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version;
그냥 클래스를 교체하십시오! 버전을 얻으려는 DLL에 정의 된 클래스 이름으로.
다른 배포에 대해 DLL을 이동하면 파일 경로를 변경할 필요가 없기 때문에 이것이 내가 선호하는 방법입니다.
FileVersionInfo
시작된 어셈블리 (윈폼, 콘솔 앱 등)를 얻으려면
using System.Reflection;
...
Assembly.GetEntryAssembly().GetName().Version
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)
@Ben의 답변이 저에게 유용하다는 것이 입증되었습니다. 그러나 소프트웨어에서 발생하는 주요 증가와 의미 버전 관리에 따라 제품 버전을 확인해야했습니다.
myFileVersionInfo.ProductVersion
이 방법은 나의 기대에 부응했다
업데이트 : 프로그램에서 dll 경로를 명시 적으로 언급하는 대신 (생산 버전에서 필요에 따라) Assembly를 사용하여 제품 버전을 얻을 수 있습니다.
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location);
string ProdVersion= fileVersionInfo.ProductVersion;
원래 질문이 웹 서비스에만 국한된 것은 아니지만 다음은 웹 서비스 캐시되지 않은 응답과 파일 버전을 표시하기 위해 추가 할 수있는 완전한 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>