2009-04-29 5 views
28

Je veux afficher (pour le débogage/info interne) la date de la dernière modification d'un assemblage, donc je saurai quand un certain site Web a été déployé.Comment puis-je obtenir la date de dernière modification de l'assemblage?

Est-il possible de passer à travers la réflexion?

-je obtenir la version comme ceci:

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, comme je l » Il sera rendu dans la page maître, et ne veut pas ce genre de frais généraux.

Répondre

42

Je vais deuxième 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 ajouter ceci:

Vous mentionnez que vous ne voulez pas accéder au système de fichiers, car il est dans votre page maître et vous don ne veux pas que ce système de fichiers supplémentaire soit utilisé pour chaque page. Ne le faites pas, accédez-y une seule fois dans l'événement de chargement de l'application, puis stockez-le en tant que variable au niveau de l'application.

+0

Salut, j'ai essayé avec ce code mais je reçois erreur de location.in mon emplacement de cas vient nulle ... donc, ce que je devoir faire ? –

2

Je ne crois pas que l'ensemble conserve la dernière information modifiée puisqu'il s'agit d'un attribut du système d'exploitation. Je crois que la seule façon d'obtenir cette information est à travers un handle de fichier.

11

Que pensez-vous de cela?

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

Si vous avez par défaut la révision et les numéros de AssemblyInfo:

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

Vous pouvez obtenir la 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); 
+0

La réponse de Hallgrim fonctionne bien, aussi.Assurez-vous simplement de modifier la version de l'assembly, pas la version du fichier (* oops *) –

+0

Attention si vous utilisez ceci dans un assembly SharePoint qui héberge un composant WebPart, car SP affichera (pour l'utilisateur) une erreur pour les composants WebPart qui ont été ajoutés à une page d'un assembly dont le numéro de version a changé depuis. Sinon, c'est une excellente réponse. – lance

4

Certaines personnes pensent que l'Assemblée ne tient date de construction mais vous savez ce qu'ils ont tort, vous pouvez récupérer l'horodatage du linker à partir du PE header intégré dans le fichier exécutable, comme suit peut fonctionner (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 est votre propre mieux vous suite à l'utilisation simple approche et facile

Ajouter ci-dessous pour pré-construction ligne de commande de l'événement:

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

Ajouter ce fichier en tant que ressource, vous avez maintenant Chaîne 'BuildDate' dans vos ressources.

j'ai pris les deux réponses de this question

+0

La réponse [Obtenir la date d'un assembly .NET] (// stackoverflow.com/q/2050396) a une classe d'assistance pour cela –

0

La solution RetrieveLinkerTimestamp ne fonctionnera pas après l'année 2038 cotisations à l'utilisation de int32 de 1970. Je suggère d'utiliser les éléments suivants (même si cela a sans doute ses limites aussi):

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