Question

En C # 3.0, j'ai une propriété supposée contenir la version de la classe. Le numéro de version est simplement la date et l'heure de la compilation. En ce moment, j'ai le code suivant:

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

Évidemment, c'est faux car cette propriété me renvoie la date et l'heure actuelles. Le précompilateur peut-il imprimer le DateTime au moment de la compilation? Dans ce cas, je pourrais faire quelque chose de similaire à ci-dessous.

public DateTime Version
{
    get { return new DateTime("PRECOMPILER DATE"); }
}
Était-ce utile?

La solution

C # n'a pas le concept de macros; Cependant, vous pouvez utiliser d'autres outils dans votre script de construction (csproj / NANT / etc) pour manipuler le source avant sa compilation. J'utilise ceci, par exemple, pour définir le numéro de révision sur la révision SVN actuelle.

Une option peu coûteuse est un événement de pré-construction (vous pouvez le faire via la boîte de dialogue des propriétés du projet dans VS): il s’agit essentiellement d’un fichier bat qui est exécuté avant la construction; vous pouvez ensuite écrire les modifications dont vous avez besoin. Une option plus sophistiquée consiste à créer des tâches.

Par exemple, la bibliothèque d’utilitaires ici comprend une tâche Heure et une tâche FileUpdate ; En théorie, il devrait être possible d’enchaîner les deux pour émuler ce dont vous avez besoin.

Personnellement, j'utiliserais les détails [AssemblyVersion] plutôt que l'heure - si vous associez cela à votre système de contrôle de code source, cela facilitera grandement la recherche de la version incriminée. donc pour ma version SVN, j’utilise (dans mon projet de construction):

<!-- 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' />

Et maintenant ma version d'assemblage est correcte, y compris la version de fichier rapportée par le système d'exploitation.

Autres conseils

Vous pouvez le récupérer à partir de la dll elle-même ( Source: codinghorror ).

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

Il n'y a pas d'équivalent pour la directive de préprocesseur __ TIME __ en C #. Le mieux que vous puissiez faire est d'obtenir l'assembly actuel et la date de création, elle contiendra l'heure de compilation. Voir ici

.

Je ne pense pas qu'il soit possible de faire cela en C # - les définitions de macro de style C ++ sont explicitement interdites.

Vous pouvez contourner ce problème en utilisant la date de dernière modification de l'assemblage ou inclure éventuellement un fichier texte en tant que ressource incorporée et ajouter une action de construction personnalisée qui y inscrit la date / heure actuelle.

Il n'y a pas de directive du préprocesseur __ TIME __ , mais vous pouvez utiliser d'autres éléments, tels que l'heure de création de l'assembly. Vous pouvez également envisager d’utiliser la substitution de mots clés à partir de votre système de contrôle de code source ($ Date $ dans subversion).

Le numéro Build peut être extrait de les métadonnées d'un assemblage et peuvent être définies pour correspondre à la date de la construction.

Normalement, vous trouverez ou créerez une entrée dans le fichier AssemblyInfo.cs. Lorsque votre projet est créé à l'aide de Visual Studio. Un exemple:

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

Un devis pour la documentation sur AssemblyVersionAttribute . (J'ai mis en gras des parties importantes)

  

Vous pouvez spécifier toutes les valeurs ou vous   peut accepter le numéro de build par défaut,   numéro de révision, ou les deux en utilisant un   astérisque (). Par exemple,   [assembly: AssemblyVersion ("2.3.25.1")]   indique 2 comme version majeure, 3 comme   la version mineure, 25 comme la construction   numéro et 1 comme numéro de révision.    Un numéro de version tel que   [assembly: AssemblyVersion ("1.2. ")]   spécifie 1 comme version majeure, 2 comme   la version mineure, et accepte le   numéros de version et de révision par défaut. A   numéro de version tel que   [assembly: AssemblyVersion ("1.2.15. *")]   spécifie 1 comme version majeure, 2 comme   la version mineure, 15 comme la construction   nombre, et accepte la valeur par défaut   numéro de révision. La construction par défaut   incréments de nombre tous les jours. Le défaut   le numéro de révision est aléatoire.

Comme vous pouvez le voir, si vous pouvez définir un numéro de build par défaut avec cela. Le numéro de build par défaut est une valeur incrémentée chaque jour.

Vous pouvez ensuite récupérer le numéro de version à l'aide de Nom d'assemblage.Version . Les exemples fournis par MSDN devraient vous aider.

Le numéro de build par défaut est le nombre de jours depuis le 1/1/2000.

Cette question a également une explication claire sur la façon de l'utiliser.

Cherchez-vous quelque chose comme ça:
(Obtenez la date de construction de l'assemblage via Version-Info; le numéro de build est en jours depuis le 1.1.2000)

         var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
        DateTime versionsDatum = new DateTime(2000, 1, 1);
        versionsDatum = versionsDatum.AddDays(version.Build);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top