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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top