Frage

ich will (für interne Debugging / info) das Datum der letzten Änderung einer Baugruppe machen, also werde ich wissen, wenn eine bestimmte Website implementiert wurde.

Ist es möglich, sie durch Reflexion zu bekommen?

Ich erhalte die Version wie folgt:

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

Ich suche nach etwas ähnliches - ich will nicht die physische Datei öffnen, erhalten ihre Eigenschaften, oder so ähnlich, wie ich es in der Master-Seite dargestellt werde, und nicht wollen, dass Art von Overhead.

War es hilfreich?

Lösung

Ich werde zweite Pyrania Antwort:

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

Aber fügen Sie diese:

Sie erwähnen Sie nicht möchten, dass das Dateisystem zugreifen, da es in der Masterseite ist und Sie nicht wollen, dass zusätzliches Dateisystem für jede Seite schlagen machen. Also nicht, es ist nur einmal Zugriff im Anwendungsladeereignis und dann speichern Sie es als Application-Level-Variable.

Andere Tipps

Wenn Sie die standardmäßige Revisions- und Buildnummern in Assembly:

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

Sie können das ein ungefähres Build-Datum erhalten mit:

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

Wie wäre das?

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

Einige Leute denken, dass Assembly hält nicht Datum bauen, aber Sie wissen, was sie falsch sind, Sie können den Linker-Zeitstempel aus dem PE-Header in der ausführbaren Datei, die wie folgt Mai eingebettet Arbeit (i havn't getestet den Code selbst)

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

oder Montage ist Ihre eigene besser Sie verwenden folgende Vorgehensweise einfach und leicht

unten In der Pre-Build-Ereignisse Befehlszeile:

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

Fügen Sie diese Datei als Ressource, jetzt String ‚Builddate‘ haben in Ihrer Ressourcen.

Ich habe beiden Antworten von diese Frage

Die RetrieveLinkerTimestamp Lösung wird nach dem Jahr 2038 Gebühren auf die Verwendung von int32 von 1970 nicht. Ich schlage vor, mit dem folgenden (obwohl dies wahrscheinlich hat seine Grenzen zu):

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

Ich glaube nicht, dass die Baugruppe zuletzt geändert Informationen hält als dass ein Betriebssystem-Attribut ist. Ich glaube, der einzige Weg, um diese Informationen über eine Datei-Handle zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top