50 votes

Obtenir la date d'un assemblage .NET

Comment puis-je récupérer la date de création de l'assemblage .NET actuel ?

J'aimerais ajouter une fonctionnalité très simple où mon application cesse de fonctionner une semaine après la date de construction de l'assemblage principal. J'ai déjà écrit le code qui tue mon application après une date donnée. J'ai juste besoin de récupérer de manière programmatique la date de création de l'assemblage.

56voto

grenade Points 10089

Ce qui suit est basé sur : https://blog.codinghorror.com/determining-build-date-the-hard-way/

public static class ApplicationInformation
{
    /// <summary>
    /// Gets the executing assembly.
    /// </summary>
    /// <value>The executing assembly.</value>
    public static System.Reflection.Assembly ExecutingAssembly
    {
        get { return executingAssembly ?? (executingAssembly = System.Reflection.Assembly.GetExecutingAssembly()); }
    }
    private static System.Reflection.Assembly executingAssembly;

    /// <summary>
    /// Gets the executing assembly version.
    /// </summary>
    /// <value>The executing assembly version.</value>
    public static System.Version ExecutingAssemblyVersion
    {
        get { return executingAssemblyVersion ?? (executingAssemblyVersion = ExecutingAssembly.GetName().Version); }
    }
    private static System.Version executingAssemblyVersion;

    /// <summary>
    /// Gets the compile date of the currently executing assembly.
    /// </summary>
    /// <value>The compile date.</value>
    public static System.DateTime CompileDate
    {
        get
        {
            if (!compileDate.HasValue)
                compileDate = RetrieveLinkerTimestamp(ExecutingAssembly.Location);
            return compileDate ?? new System.DateTime();
        }
    }
    private static System.DateTime? compileDate;

    /// <summary>
    /// Retrieves the linker timestamp.
    /// </summary>
    /// <param name="filePath">The file path.</param>
    /// <returns></returns>
    /// <remarks>http://www.codinghorror.com/blog/2005/04/determining-build-date-the-hard-way.html</remarks>
    private static System.DateTime RetrieveLinkerTimestamp(string filePath)
    {
        const int peHeaderOffset = 60;
        const int linkerTimestampOffset = 8;
        var b = new byte[2048];
        System.IO.FileStream 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();
        }
        var dt = new System.DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(System.BitConverter.ToInt32(b, System.BitConverter.ToInt32(b, peHeaderOffset) + linkerTimestampOffset));
        return dt.AddHours(System.TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
    }
}

46voto

Rob Levine Points 20793

Je ne pense pas que l'assemblage lui-même contienne sa date de création. Je pense que la date la plus proche que vous pouvez obtenir est la date de création du fichier d'assemblage lui-même :

File.GetCreationTime(Assembly.GetExecutingAssembly().Location)

devrait faire l'affaire.

EDIT :

Je pense que la solution de Jeff Atwood, décrite par "grenade" dans ce fil de discussion, est probablement la meilleure façon de procéder maintenant.

30voto

Wim Hollebrandse Points 8628

Qu'est-ce qui ne va pas avec :

System.IO.File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location);

9voto

jmlumpkin Points 476

Peut-être que ce post sur l'horreur du codage peut aider

5voto

Jake Pearson Points 9657

Cela devrait fonctionner :

var entryAssembly = Assembly.GetEntryAssembly();
var fileInfo = new FileInfo(entryAssembly.Location);
var buildDate = fileInfo.LastWriteTime;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X