Frage Äquivalent von __DATE__, __TIME__ Makros in C #


Gibt es ein Äquivalent von? __DATE__ und __TIME__ in C #?

Im Grunde versuche ich etwas Zeitstempel in eine C # -Anwendung zu schreiben.

Eine Möglichkeit Ich sah auf der Microsoft-Website Folgendes tun:

Assembly assem = Assembly.GetExecutingAssembly();
Version vers = assem.GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1).AddDays(vers.Build).AddSeconds(vers.Revision * 2);
Console.WriteLine(vers.ToString());
Console.WriteLine(buildDate.ToString());

Dies funktioniert jedoch nur, wenn Ihre Version in AssemblyInfo.cs "1.0.."Das wird unser nicht sein.


13
2017-08-20 22:24


Ursprung


Antworten:


Ich empfehle, das Build-Skript anzupassen, um das Datum in die Datei zu schreiben. Das MSBuild Community-Aufgaben Projekt hat eine Zeitaufgabe, die genau dafür verwendet werden kann.


4
2017-08-20 23:28



Wenn Sie versuchen, Ihre Build- und Revisionsnummern automatisch zu generieren, würde ich das folgende Projekt in CodePlex untersuchen:

http://autobuildversion.codeplex.com/


2
2017-08-20 22:32



Sie könnten die CSProj-Datei des Projekts anpassen. Dies ist nur eine gewöhnliche msbuild-Datei, und Sie können sich in das BeforeBuild-Ziel einklinken, um eine Datei zu generieren oder zu aktualisieren. Vielleicht speichern Sie diesen Wert in einem benutzerdefinierten Attribut auf Baugruppenebene.

Ich würde mir vorstellen, dass die msbuild-Community-Aufgaben hier nützlich wären, da sie mehrere hilfreiche Aufgaben für Dinge wie den Austausch von Token innerhalb einer Datei haben.


1
2017-08-20 23:23



Kurze Antwort: NEIN. Es gibt kein Äquivalent. Sie haben es weggelassen. Schade. Witze über dich.

Es gibt einige fast gleichwertige Work-Arounds, alles basierend auf dem Programm selbst untersucht. Keine ist rational, elegant oder robust.

Einige Lösungen nehmen das Kompilierungsdatum + -Zeit von "AssemblyVersion", einer Struktur von vier UInt16-Feldern ("Hauptversion", "Nebenversion", "Build-Nummer" und "Revision"), die das ab Datum und Uhrzeit sind nicht garantiertviel weniger in einem bestimmten Format. Wenn Sie AssemblyVersion auf "ab *" setzen (und niemand ändert), überschreibt der Compiler es auf abcd, wobei c == Tage und d * 2 == Sekunden seit dem 1. Januar 2000 um 00:00 Uhr (Ortszeit) , ignoriert aber die Sommerzeit), parst AssemblyInfo.cs. Diese werden in das Programm kompiliert, wo sie über System.Reflection.Assembly.GetExecutingAssembly () aufgerufen werden können. GetName (). Version.

Bei anderen Lösungen greift die ausführbare Datei in das Dateisystem ein, um das Datum und die Uhrzeit der letzten Änderung abzurufen aus seinen eigenen Metadaten, die durch die Übertragung über FAT, CDFS oder FTP mit DST- oder Zeitzonenänderungen, Lazy-FTP-Servern, die Metadaten sofort verwerfen, oder Datei-Dienstprogramme, die Metadaten auf Anfrage ändern, leicht geändert oder beschädigt werden können. Erbärmlich.

Wo ist der, die, das Kompilierzeitkonstante (oder Konstanten), vielleicht #NOW (oder #YEAR, #MONTH, #DAY, etc.), die in Ausdrücken benutzt werden können oder einer const oder einer readonly zugewiesen werden? CodeWarrior C, GCC, MS C und MS C ++ geben die standardmäßigen vordefinierten Makros an __DATE__ und __TIME__ , die wie Zeichenkonstanten für die Kompilierung verwendet werden können. Es scheint eine eklatante Auslassung von C # zu sein, die jeden dazu bringt, Menschenjahre zu verschwenden, die nach Work-Arounds fragen und diese einrichten. Neue Sprache, neuer Code, pathetisches klappiges Design. C # hat keine Makros. C # hat #define nur "definiert" oder "undefiniert". NA UND? Ich sehe keine Entschuldigung für das Löschen wichtiger Kompilierzeitkonstanten. Wie wäre es damit, es in C # 's gefälschten Pro-Prozessor zu stecken?

17 Jahre in "Simple Managed C" / "C-ähnliche objektorientierte Sprache", CIL und CLR, und das ist es? Eine Million Möglichkeiten, Code zu schreiben, der nicht das tut, was er sagt (Implementierung von Threading)? Bibliotheken, die jeden Fehler der "zugrunde liegenden Methode" aufdecken? Sie müssen eine (oder beide) von zielen zwei separate virtuelle Maschinen: eine 32-Bit-VM für 32-Bit-Hardware (oder Emulator) und eine 64-Bit-VM für 64-Bit-Hardware (nur) - was ist daran virtuell? Java kompiliert einmal, nur für ein virtuelle Maschine, die natürlich separate Implementierungen für jede Plattform (32 oder 64) hat.


1
2017-11-05 17:45



Hässlich, und erfordert bestimmte Berechtigungen, aber wenn dies für den internen Gebrauch ist:

            // assume the relevant using statements above...
            FileVersionInfo vi = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
            FileInfo fileInfo = new System.IO.FileInfo(vi.FileName);
            DateTime createTime = fileInfo.CreationTime;

0
2017-11-30 14:41



Terminzeit DATUM = File.GetLastWriteTime (Application.ExecutablePath);


0
2017-10-01 12:09