.net asp.net reflection file-properties modified-date

.net - ¿Cómo puedo obtener la fecha de la última modificación del conjunto?



asp.net reflection (6)

Quiero renderizar (para depuración / información interna) la última fecha de modificación de un ensamblaje, así sabré cuándo se implementó cierto sitio web.

¿Es posible obtenerlo a través de la reflexión?

Me sale la versión así:

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

Estoy buscando algo similar: no quiero abrir el archivo físico, obtener sus propiedades o algo así, ya que lo presentaré en la página maestra y no quiero ese tipo de sobrecarga. .


¿Qué tal esto?

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


Algunas personas piensan que Assembly no tiene fecha de compilación, pero sabes lo que están mal, puedes recuperar la marca de tiempo del enlazador desde el encabezado PE incrustado en el archivo ejecutable, como lo siguiente puede funcionar (no he probado el código yo mismo)

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 si el montaje es mejor que el suyo, utilice el siguiente enfoque simple y fácil

Agregue a continuación a la línea de comando del evento preconstruido:

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

Agregue este archivo como recurso, ahora tiene cadena ''BuildDate'' en sus recursos.

He tomado ambas respuestas de esta pregunta


La solución RetrieveLinkerTimestamp no funcionará después del año 2038 int32 al uso de int32 desde 1970 . Sugiero usar lo siguiente (aunque esto probablemente también tenga sus limitaciones):

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


No creo que el ensamblado contenga la última información modificada, ya que es un atributo del sistema operativo. Creo que la única manera de obtener esta información es a través de un identificador de archivo.


Si predetermina los números de revisión y compilación en AssemblyInfo:

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

Puede obtener una fecha aproximada de compilación con:

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


Voy a la segunda respuesta de pYrania:

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

Pero agrega esto:

Menciona que no desea acceder al sistema de archivos porque está en su página maestra y no desea que el sistema de archivos adicional se active en cada página. Así que no, solo acceda una vez en el evento Application load y luego guárdelo como una variable de nivel de aplicación.