문제

어셈블리의 마지막 수정 날짜를 (내부 디버깅/정보에 대해) 렌더링하고 싶습니다. 특정 웹 사이트가 언제 배포되었는지 알 수 있습니다.

반사를 통해 그것을 얻을 수 있습니까?

나는 다음과 같은 버전을 얻는다 :

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)

나는 조립품이 운영 체제 속성이기 때문에 마지막 수정 된 정보를 보유하고 있다고 생각하지 않습니다. 이 정보를 얻는 유일한 방법은 파일 핸들을 통한 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top