2009-04-29 15 views
28

Chcę renderować (do wewnętrznego debugowania/informacji) datę ostatniej modyfikacji zespołu, aby wiedzieć, kiedy została wdrożona określona witryna.Jak mogę uzyskać datę ostatniej modyfikacji zespołu?

Czy można to uzyskać poprzez odbicie?

uzyskać wersję takiego:

Assembly.GetExecutingAssembly().GetName().Version.ToString(); 

szukam czegoś podobnego - nie chcę, aby otworzyć plik fizycznej, dostać jego właściwości, czy coś takiego, jak ja” Będziesz renderował go na stronie wzorcowej i nie chcesz tego rodzaju kosztów.

Odpowiedz

42

będę drugi pYrania za odpowiedź:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location); 
DateTime lastModified = fileInfo.LastWriteTime; 

jednak dodać to:

można wspomnieć, że nie chcesz, aby uzyskać dostęp do systemu plików, ponieważ znajduje się na stronie głównej i don nie chcesz, aby dodatkowy system plików trafiał na każdą stronę. Więc nie, po prostu wejdź do niego raz w zdarzeniu ładowania aplikacji, a następnie zapisz jako zmienną poziomu aplikacji.

+0

Witam, próbowałem z tym kodem, ale dostaję błąd lokalizacji. Moja lokalizacja jest nieważna ... więc, co ja musieć zrobić ? –

2

Nie wierzę, że zespół zawiera informacje o ostatniej modyfikacji, ponieważ jest to atrybut systemu operacyjnego. Wierzę, że jedynym sposobem na uzyskanie tych informacji jest uchwyt pliku.

11

Co powiesz na to?

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location); 
DateTime lastModified = fileInfo.LastWriteTime; 
13

Jeśli domyślne rewizji i budować liczb w AssemblyInfo:

[assembly: AssemblyVersion("1.0.*")] 

można uzyskać przybliżoną datę kompilacji z:

Version version = typeof(MyType).Assembly.GetName().Version; 
DateTime date = new DateTime(2000, 1, 1) 
    .AddDays(version.Build) 
    .AddSeconds(version.Revision * 2); 
+0

Odpowiedź Hallgrima również działa dobrze.Po prostu upewnij się, że modyfikujesz wersję złożenia, a nie wersję pliku (* oops *) –

+0

Ostrożnie, jeśli używasz tego w zespole programu SharePoint, w którym znajduje się składnik Web Part, ponieważ SP wyświetli (użytkownikowi) błąd dotyczący składników Web Part które zostały dodane do strony ze złożenia, którego numer wersji został zmieniony. W przeciwnym razie jest to świetna odpowiedź. – lance

4

Niektórzy ludzie uważają, że Zgromadzenie nie posiada datę budowy ale wiesz, co jest nie tak, możesz pobrać znacznik czasu linkera z PE header osadzonego w pliku wykonywalnym, tak jak podążanie może działać (nie przetestowałem kodu samodzielnie)

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; 
} 

czy montaż jest twój własnego lepiej użyć poniższy proste podejście i łatwy

Dodaj poniżej pre-build wiersza polecenia wydarzenia:

echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt" 

Dodaj ten plik jako zasobu, teraz masz Łańcuch "BuildDate" w Twoich zasobach.

Brałem obie odpowiedzi od this question

+0

Odpowiedź [Uzyskanie daty zgromadzenia .NET] (// stackoverflow.com/q/2050396) ma klasę pomocniczą dla niego –

0

roztworze RetrieveLinkerTimestamp nie będzie działać po roku 2038 składki do wykorzystania int32 z 1970. Sugeruję użycie następujących (chociaż to też ma swoje ograniczenia):

IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)