Pregunta

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

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

Obtengo la versión como esta:

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 estaré mostrando en la página maestra y no quiero eso. tipo de sobrecarga.

¿Fue útil?

Solución

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 agregue esto:

Menciona que no desea acceder al sistema de archivos, ya que se encuentra en su página maestra y no desea que ese sistema de archivos adicional sea un éxito para cada página. Así que no lo haga, solo acceda a él una vez en el evento de carga de la aplicación y luego guárdelo como una variable de nivel de aplicación.

Otros consejos

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

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

Puede obtener una fecha de compilación aproximada con:

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

¿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 usted sabe en qué están equivocados. puede recuperar la marca de tiempo del vinculador desde el encabezado PE incrustado en el archivo ejecutable, como en mayo siguiente trabajo (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 ensamblaje es mejor para usted, utilice el siguiente método simple y fácil

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

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

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

He tomado ambas respuestas de esta pregunta

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top