Frage

In C # 3.0, habe ich eine Eigenschaft, die die Version der Klasse enthalten ist wohl. Die Versionsnummer ist einfach das Datum und die Uhrzeit der Erstellung. Gerade jetzt, ich habe den folgenden Code:

public DateTime Version
{
    get { return DateTime.UtcNow; }
}

Dies ist offensichtlich falsch, da diese Eigenschaft gibt mir das aktuelle Datum und die Uhrzeit. So ist der Precompiler kann Drucken die Datetime bei der Kompilierung? In diesem Fall habe ich etwas ähnliches wie unten tun könnte.

public DateTime Version
{
    get { return new DateTime("PRECOMPILER DATE"); }
}
War es hilfreich?

Lösung

C # nicht über das Konzept des Makros; Sie können jedoch andere Werkzeuge in Ihrem Build-Skript (csproj / NANT / etc) verwenden, um die Quelle zu manipulieren, bevor es kompiliert. Ich benutze dies zum Beispiel der Versionsnummer der aktuellen SVN-Revision zu setzen.

Eine günstige Option ist ein Pre-Build-Ereignis (Sie dies über die Projekteigenschaften tun können, in VS-Dialog): im Wesentlichen einer Fledermaus-Datei, die vor Build läuft; Sie können dann, was Skript ändert die Sie benötigen. Eine anspruchsvollere Option Aufgaben aufzubauen.

Zum Beispiel kann die Utility-Bibliothek hier eine Time Aufgabe und eine FileUpdate Aufgabe umfasst; sollte es (theoretisch) die beiden zusammen zu Kette möglich sein, zu emulieren, was Sie brauchen.

Persönlich würde ich die [AssemblyVersion] Details verwenden, anstatt die Zeit - wenn Sie diesen Link zu Ihrem Source-Control-System, das macht es sehr einfach, die säumige Version zu finden; so für meine SVN-Version habe ich dann verwenden (in meinem Build proj):

<!-- See http://msbuildtasks.tigris.org -->
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
  <Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
...
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />

Und nun meine Montage-Version korrekt ist, einschließlich der Datei-Version, die von den OS gemeldet wird.

Andere Tipps

Sie können es von der dll retreive selbst ( Quelle: Coding )

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

Es gibt kein Äquivalent für die __TIME__ Präprozessordirektive in C #, Das Beste, was Sie tun können, ist die aktuelle Assembly erhalten und das Erstellungsdatum bekommen, wird es die Kompilierung enthalten. Siehe hier

Ich glaube nicht, dass es eine Möglichkeit, dies in C # zu tun -. C ++ Stil Makrodefinitionen explictly nicht anerkannt werden

Sie könnten arbeiten um es entweder das Datum der letzten Änderung der Anordnung, oder möglicherweise eine Textdatei als eingebettete Ressource enthalten und eine benutzerdefinierte Build-Aktion hinzufügen, die das aktuelle Datum / Zeit in sie schreibt.

Es gibt keine Präprozessor __TIME__ Richtlinie, aber es gibt andere Dinge, die man, wie die Erstellungszeit der Baugruppe verwenden. Sie könnten auch Keyword Substitution von Ihrem Source-Control-System ($ Date $ in Subversion) in Betracht ziehen.

Die Nummer zusammen aus abgerufen werden die Metadaten einer Baugruppe und eingestellt werden kann, mit dem Datum des Builds.

übereinstimmen

Normalerweise werden Sie feststellen, oder einen Eintrag in der AssemblyInfo.cs-Datei erstellen. Wenn Ihr Projekt mit Visual Studio erstellt. Ein Beispiel:

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

Ein Angebot für die Dokumentation auf Assembly . (Ich habe ein paar wichtige Teile bolded)

  

Sie können angeben, alle Werte oder Sie   kann die Standard-Build-Nummer akzeptieren,   Revisionsnummer oder beide durch ein unter Verwendung von   Sternchen (). Zum Beispiel,   [Assembly: Assembly ( "2.3.25.1")]   zeigt 2 als Hauptversion, 3 als   die kleinere Version, 25 als Build   Nummer und 1 als die Revisionsnummer.    Eine Versionsnummer wie   [Assembly: ( "1.2 ") Assembly]   gibt 1 als Hauptversion, 2 als   die kleinere Version, und nimmt die   Standard-Build und Versionsnummern. A   Versionsnummer wie   [Assembly: Assembly ( "1.2.15 *")]   gibt 1 als Hauptversion, 2 als   die kleinere Version, 15 als Build   Nummer und übernimmt den Standard   Revisionsnummer. Das Standard-Build   Zahl erhöht täglich. Der Standard   Revisionsnummer ist zufällig.

Wie Sie sehen können, wenn Sie eine Standard-Build-Nummer mit diesem Satz können. Die Standard-Build-Nummer ist ein Wert, der jeden Tag erhöht wird.

Sie können dann rufen Sie die Build-Nummer von der AssemblyName.Version Eigenschaft. Die Beispiele, die von MSDN sollten Sie gehen.

Die Standard-Build-Nummer ist die Anzahl der Tage seit dem 1.1.2000.

Diese Frage hat auch eine klare Erklärung, wie diese verwenden.

Sie suchen Sie etwas wie folgt aus:
(Get ist das Datum der Bau der Versammlung über Version-Info; Errichten-Anzahl ist Tage seit 1.1.2000)

         var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
        DateTime versionsDatum = new DateTime(2000, 1, 1);
        versionsDatum = versionsDatum.AddDays(version.Build);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top