2009-04-29 22 views
28

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

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

conseguir la versión de esta manera:

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

Busco algo similar - no quiero abrir el archivo físico, obtener sus propiedades, o algo por el estilo, que a mí Lo renderizo en la página maestra y no quiero ese tipo de sobrecarga.

Respuesta

42

Voy a 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 añadir:

Usted menciona que no desea tener acceso al sistema de archivos, ya que es en su página principal y que Don No quiero hacer que ese sistema de archivos extra llegue a todas las páginas. Así que no, solo acceda una vez en el evento Application load y luego guárdelo como una variable de nivel de aplicación.

+0

Hola, he tratado con este código, pero estoy consiguiendo el error de location.in mi ubicación caso viene nula ... así, lo que Tener que hacer ? –

2

No creo que el ensamblado tenga 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.

11

¿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; 
13

Si usted no cumple con la revisión y compilación de AssemblyInfo:

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

Usted puede obtener la fecha aproximada de la estructura con:

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

La respuesta de Hallgrim también funciona bien.Solo asegúrese de modificar la versión del ensamblaje, no la versión del archivo (* oops *) –

+0

Tenga cuidado si usa esto en un ensamblaje de SharePoint que aloja un elemento web, ya que SP mostrará (al usuario) un error para los elementos web que se agregaron a una página de un ensamblado cuyo número de versión cambió desde entonces. De lo contrario, esta es una gran respuesta. – lance

4

Algunas personas piensan que la Asamblea no tiene fecha de construcción pero sabes lo que están equivocados, puedes recuperar la marca de tiempo del enlazador desde el PE header 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 su propio mejor que utilizar siguiente enfoque simple y fácil

Añadir a continuación a pre-construcción de línea de comandos del evento:

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

Añadir este archivo como recurso, ahora usted tiene Cadena 'BuildDate' en tus recursos.

que han tomado las dos respuestas de this question

+0

La respuesta [Cómo obtener la fecha de un ensamblado .NET] (// stackoverflow.com/q/2050396) tiene una clase de ayuda para ello –

0

La solución RetrieveLinkerTimestamp no va a funcionar después del año 2038 cuotas a la utilización de int32 de 1970. Sugiero utilizando la siguiente (aunque esto probablemente tiene sus limitaciones también):

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