어셈블리 마지막 수정 날짜를 어떻게 얻을 수 있습니까?
-
03-07-2019 - |
문제
어셈블리의 마지막 수정 날짜를 (내부 디버깅/정보에 대해) 렌더링하고 싶습니다. 특정 웹 사이트가 언제 배포되었는지 알 수 있습니다.
반사를 통해 그것을 얻을 수 있습니까?
나는 다음과 같은 버전을 얻는다 :
Assembly.GetExecutingAssembly().GetName().Version.ToString();
나는 비슷한 것을 찾고 있습니다 - 물리적 파일을 열고, 속성을 얻고 싶지 않습니다. 마스터 페이지에서 그것을 렌더링하고 그런 종류의 오버 헤드를 원하지 않기 때문에. .
해결책
두 번째 피라 니아의 대답 :
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;
그러나 이것을 추가하십시오 :
마스터 페이지에 있으므로 파일 시스템에 액세스하고 싶지 않으며 모든 페이지에 대해 추가 파일 시스템을 누르고 싶지 않다고 언급합니다. 따라서 응용 프로그램로드 이벤트에서 한 번 액세스 한 다음 응용 프로그램 수준 변수로 저장하지 마십시오.
다른 팁
기본적으로 개정판을 기본적으로 작성하고 AssemblyInfo에서 숫자를 작성하는 경우 :
[assembly: AssemblyVersion("1.0.*")]
대략적인 빌드 날짜를 얻을 수 있습니다.
Version version = typeof(MyType).Assembly.GetName().Version;
DateTime date = new DateTime(2000, 1, 1)
.AddDays(version.Build)
.AddSeconds(version.Revision * 2);
이건 어때?
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;
어떤 사람들은 어셈블리가 빌드 날짜를 보유하지 않다고 생각하지만 자신이 무엇이 잘못되었는지 알고 있습니다. PE 헤더 다음과 같이 실행 파일에 내장되어 있습니다.
private DateTime RetrieveLinkerTimestamp()
{
string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
const int c_PeHeaderOffset = 60;
const int c_LinkerTimestampOffset = 8;
byte[] b = new byte[2048];
System.IO.Stream s = null;
try
{
s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
s.Read(b, 0, 2048);
}
finally
{
if (s != null)
{
s.Close();
}
}
int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
dt = dt.AddSeconds(secondsSince1970);
dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
return dt;
}
또는 어셈블리가 자신의 더 나은 경우 간단하고 쉬운 다음 접근 방식을 사용합니다.
예비 건축 이벤트 명령 줄에 아래를 추가하십시오.
echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"
이 파일을 리소스로 추가하십시오. 이제 리소스에 'BuildDate'문자열이 있습니다.
나는 두 답변을 모두 가져 갔다 이 질문
그만큼 RetrieveLinkerTimestamp
솔루션은 해 이후에 작동하지 않습니다 2038
사용에 대한 회비 int32
~에서 1970
. 다음을 사용하는 것이 좋습니다 (아마도 제한 사항도 있습니다).
IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)
나는 조립품이 운영 체제 속성이기 때문에 마지막 수정 된 정보를 보유하고 있다고 생각하지 않습니다. 이 정보를 얻는 유일한 방법은 파일 핸들을 통한 것입니다.