2009-04-29 8 views
28

Voglio rendere (per il debugging interno/informazioni) l'ultima data di modifica di un assembly, quindi saprò quando un determinato sito Web è stato distribuito.Come posso ottenere la data dell'ultima modifica del montaggio?

È possibile ottenere attraverso il riflesso?

ottengo la versione in questo modo:

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

Sto cercando qualcosa di simile - Non voglio aprire il file fisico, ottenere le sue proprietà, o qualcosa di simile, come ho' Lo renderò nella pagina principale, e non voglio quel tipo di overhead.

risposta

42

sarò seconda risposta di pYrania:

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

Ma aggiungo questo:

Lei parla non si desidera accedere al file system dal momento che è nella tua pagina master e don voglio fare quel file system in più per tutte le pagine. Quindi non farlo, basta accedervi una volta nell'evento di caricamento dell'applicazione e quindi memorizzarlo come variabile a livello di applicazione.

+0

Ciao, ho provato con questo codice, ma sto ottenendo l'errore di location.in mio caso posizione è venuta nulla ... quindi, quello che ho devo fare? –

2

Non credo che l'assembly contenga le ultime informazioni modificate poiché questo è un attributo del sistema operativo. Credo che l'unico modo per ottenere queste informazioni sia attraverso un handle di file.

11

Che ne dici di questo?

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

Se di default la revisione e di build in AssemblyInfo:

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

è possibile ottenere la una data approssimativa di compilazione con:

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

La risposta di Hallgrim funziona bene, anche.Assicurati di modificare la versione dell'assembly, non la versione del file (* oops *) –

+0

Attenzione se stai usando questo in un assembly SharePoint che ospita una web part, poiché SP mostrerà (all'utente) un errore per le web part che sono stati aggiunti a una pagina da un assembly il cui numero di versione è cambiato da allora. Altrimenti questa è un'ottima risposta. – lance

4

Alcune persone pensano che Assemblea non tiene Data costruire ma sai cosa sono errati, puoi recuperare il timestamp del linker dal PE header incorporato nel file eseguibile, come segue potrebbe funzionare (non ho provato il codice da solo)

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

o se il montaggio è il vostro proprio meglio utilizzare seguente approccio semplice e facile

Aggiungere al di sotto di pre-build riga di comando evento:

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

Aggiungere questo file come risorsa, ora avete Stringa 'BuildDate' nelle tue risorse.

ho preso entrambe le risposte da this question

+0

La risposta [Ottenere la data di un assembly .NET] (// stackoverflow.com/q/2050396) ha una classe di supporto per questo –

0

La soluzione RetrieveLinkerTimestamp non funziona dopo l'anno 2038 quote per l'utilizzo del int32 da 1970. Suggerisco usando il seguente (anche se questo probabilmente ha i suoi limiti troppo):

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