Come posso ottenere la data dell'ultima modifica dell'assemblaggio?
-
03-07-2019 - |
Domanda
Voglio rendere (per il debug interno / informazioni) l'ultima data modificata di un assembly, quindi saprò quando è stato distribuito un determinato sito Web.
È possibile superare la riflessione?
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 del genere, poiché lo renderò nella pagina principale e non lo voglio tipo di spese generali.
Soluzione
Secondo la 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 aggiungi questo:
Dici che non vuoi accedere al file system poiché si trova nella tua pagina principale e non vuoi che quel file system aggiuntivo colpisca per ogni pagina. Quindi, non accedervi una volta nell'evento di caricamento dell'applicazione e quindi archiviarlo come variabile a livello di applicazione.
Altri suggerimenti
Se si predefiniscono la revisione e i numeri di build in AssemblyInfo:
[assembly: AssemblyVersion("1.0.*")]
Puoi ottenere una data di costruzione approssimativa con:
Version version = typeof(MyType).Assembly.GetName().Version;
DateTime date = new DateTime(2000, 1, 1)
.AddDays(version.Build)
.AddSeconds(version.Revision * 2);
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;
Alcune persone pensano che Assembly non abbia una data di compilazione ma sai cosa hanno sbagliato, puoi recuperare il timestamp del linker dalla intestazione PE incorporata nel file eseguibile, come segue può funziona (non ho testato 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 assembly è il tuo meglio, usi il seguente approccio semplice e facile
Aggiungi sotto alla riga di comando dell'evento pre-build:
echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"
Aggiungi questo file come risorsa, ora hai la stringa 'BuildDate' nelle tue risorse.
Ho preso entrambe le risposte da questa domanda
La soluzione RetrieveLinkerTimestamp
non funzionerà dopo l'anno 2038
a causa dell'uso di int32
da 1970
. Suggerisco di usare quanto segue (anche se probabilmente questo ha anche i suoi limiti):
IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)
Non credo che l'assembly contenga le ultime informazioni modificate in quanto si tratta di un attributo del sistema operativo. Credo che l'unico modo per ottenere queste informazioni sia attraverso un handle di file.