Question

Je souhaite rendre (pour le débogage interne / les informations) la date de dernière modification d'un assemblage, afin que je sache à quel moment un site Web a été déployé.

Est-il possible de le faire par réflexion?

Je reçois la version suivante:

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

Je cherche quelque chose de similaire - je ne veux pas ouvrir le fichier physique, obtenir ses propriétés, ou quelque chose comme ça, car je le rendrai dans la page maître, et je ne le veux pas genre de frais généraux.

Était-ce utile?

La solution

J'appuie la réponse de pYrania:

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

Mais ajoutez ceci:

Vous indiquez que vous ne souhaitez pas accéder au système de fichiers car il se trouve dans votre page maître et que vous ne souhaitez pas que ce système de fichiers supplémentaire soit activé pour chaque page. Dans ce cas, il suffit d’y accéder une fois dans l’enregistrement de chargement d’application, puis de le stocker en tant que variable au niveau de l’application.

Autres conseils

Si vous définissez par défaut les numéros de révision et de construction dans AssemblyInfo:

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

Vous pouvez obtenir une date de construction approximative avec:

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

Comment ça?

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

Certaines personnes pensent que l’assemblée ne tient pas la date de construction, mais vous savez ce qu’elles ne vont pas, vous pouvez récupérer l'horodatage de l'éditeur de liens à partir de en-tête PE intégré au fichier exécutable, comme suit travail (je n'ai pas testé le code moi-même)

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;
}

ou si l'assemblage vous appartient, vous feriez mieux d'utiliser l'approche suivante simple et facile

Ajouter ci-dessous à la ligne de commande de l'événement de pré-génération:

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

Ajoutez ce fichier en tant que ressource. Vous disposez maintenant de la chaîne 'BuildDate' dans vos ressources.

J'ai pris les deux réponses de cette question

La solution RetrieveLinkerTimestamp ne fonctionnera plus après l'année 2038 due à l'utilisation de int32 à partir de 1970 . Je suggère d'utiliser les éléments suivants (bien que cela ait probablement aussi ses limites):

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

Je ne pense pas que l'assemblage conserve les dernières informations modifiées, car il s'agit d'un attribut du système d'exploitation. Je crois que le seul moyen d’obtenir ces informations est d’utiliser un descripteur de fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top