J'ai actuellement une application affichant le numéro de build dans sa fenêtre de titre. C'est bien beau, sauf que cela ne signifie rien pour la plupart des utilisateurs, qui veulent savoir s'ils ont la dernière version - ils ont tendance à s'y référer comme "jeudi dernier" plutôt qu'à la version 1.0.8.4321.
Le plan est de mettre la date de construction à la place - Donc, "Application construite le 21/10/2009" par exemple.
J'ai du mal à trouver un moyen programmatique pour extraire la date de construction sous forme de chaîne de texte à utiliser comme ceci.
Pour le numéro de build, j'ai utilisé:
Assembly.GetExecutingAssembly().GetName().Version.ToString()
après avoir défini comment ceux-ci sont venus.
J'aimerais quelque chose comme ça pour la date de compilation (et l'heure, pour les points bonus).
Des pointeurs ici très appréciés (excuse jeu de mots si approprié), ou des solutions plus soignées ...
la source
Réponses:
Jeff Atwood avait quelques choses à dire sur ce problème dans Déterminer la date de construction à la dure .
La méthode la plus fiable s'avère être la récupération de l'horodatage de l'éditeur de liens à partir de l'en- tête PE intégré dans le fichier exécutable - du code C # (par Joe Spivey) pour cela dans les commentaires de l'article de Jeff:
Exemple d'utilisation:
MISE À JOUR: La méthode fonctionnait pour .Net Core 1.0, mais a cessé de fonctionner après la sortie de .Net Core 1.1 (donne des années aléatoires dans la plage 1900-2020)
la source
.AddHours()
est plutôt hackish et (je pense) ne tiendra pas compte de l'heure d'été. Si vous le souhaitez à l'heure locale, vous devez utiliser le nettoyeur à ladt.ToLocalTime();
place. La partie centrale pourrait également être grandement simplifiée avec unusing()
bloc.Ajoutez ci-dessous à la ligne de commande d'événement de pré-génération:
Ajoutez ce fichier en tant que ressource, vous avez maintenant la chaîne 'BuildDate' dans vos ressources.
Pour créer des ressources, consultez Comment créer et utiliser des ressources dans .NET .
la source
Le chemin
Comme l'a souligné @ c00000fd dans les commentaires . Microsoft change cela. Et bien que beaucoup de gens n'utilisent pas la dernière version de leur compilateur, je soupçonne que ce changement rend cette approche incontestablement mauvaise. Et bien que ce soit un exercice amusant, je recommanderais aux gens d'incorporer simplement une date de construction dans leur binaire par tout autre moyen nécessaire s'il est important de suivre la date de construction du binaire lui-même.
Cela peut être fait avec une génération de code triviale qui est probablement déjà la première étape de votre script de construction. Cela, et le fait que les outils ALM / Build / DevOps aident beaucoup à cela et devraient être préférés à toute autre chose.
Je laisse le reste de cette réponse ici à des fins historiques uniquement.
La nouvelle façon
J'ai changé d'avis à ce sujet et j'utilise actuellement cette astuce pour obtenir la bonne date de construction.
L'ancienne façon
Eh bien, comment générer des numéros de build? Visual Studio (ou le compilateur C #) fournit en fait des numéros de construction et de révision automatiques si vous changez l'attribut AssemblyVersion par exemple
1.0.*
Ce qui se passera, c'est que la génération sera égale au nombre de jours depuis le 1er janvier 2000, heure locale, et que la révision soit égale au nombre de secondes depuis minuit, heure locale, divisé par 2.
voir les numéros de contenu communautaire, de génération automatique et de révision
par exemple AssemblyInfo.cs
SampleCode.cs
la source
TimeZone.CurrentTimeZone.IsDaylightSavingTime(buildDateTime) == true
IMAGE_FILE_HEADER::TimeDateStamp
champ est défini sur un nombre aléatoire et n'est plus un horodatage.Ajoutez ci-dessous à la ligne de commande d'événement de pré-génération:
Ajoutez ce fichier en tant que ressource, vous avez maintenant la chaîne 'BuildDate' dans vos ressources.
Après avoir inséré le fichier dans la ressource (en tant que fichier texte public), je l'ai accédé via
Pour créer des ressources, consultez Comment créer et utiliser des ressources dans .NET .
la source
Une approche que je suis étonné que personne n'a encore mentionnée consiste à utiliser des modèles de texte T4 pour la génération de code.
Avantages:
Les inconvénients:
la source
Constants.CompilationTimestampUtc
. Si VS ne génère pas de fichier C # avec la classe, vous devez trouver comment le faire, mais la réponse dépend (au moins) de la version de VS et du type de fichier csproj, il est donc trop de détails pour ce post.En ce qui concerne la technique d'extraction des informations de date / version de génération à partir des octets d'un en-tête PE d'assembly, Microsoft a modifié les paramètres de génération par défaut à partir de Visual Studio 15.4. La nouvelle valeur par défaut inclut la compilation déterministe, ce qui fait qu'un horodatage valide et des numéros de version incrémentés automatiquement appartiennent au passé. Le champ d'horodatage est toujours présent mais il est rempli avec une valeur permanente qui est un hachage de quelque chose ou autre, mais pas d'indication du temps de construction.
Quelques informations détaillées ici
Pour ceux qui priorisent un horodatage utile sur la compilation déterministe, il existe un moyen de remplacer la nouvelle valeur par défaut. Vous pouvez inclure une balise dans le fichier .csproj de l'assemblage d'intérêt comme suit:
Mise à jour: J'approuve la solution de modèle de texte T4 décrite dans une autre réponse ici. Je l'ai utilisé pour résoudre mon problème proprement sans perdre l'avantage de la compilation déterministe. Une mise en garde à ce sujet est que Visual Studio n'exécute le compilateur T4 que lorsque le fichier .tt est enregistré, pas au moment de la génération. Cela peut être gênant si vous excluez le résultat .cs du contrôle de code source (car vous vous attendez à ce qu'il soit généré) et qu'un autre développeur extrait le code. Sans réenregistrement, ils n'auront pas le fichier .cs. Il y a un paquet sur nuget (je pense appelé AutoT4) qui fait de la compilation T4 une partie de chaque build. Je n'ai pas encore confronté la solution à cela lors du déploiement de la production, mais j'attends quelque chose de similaire pour faire les choses correctement.
la source
Je suis juste un débutant en C #, alors peut-être que ma réponse semble idiote - j'affiche la date de construction à partir de la date à laquelle le fichier exécutable a été écrit pour la dernière fois:
J'ai essayé d'utiliser la méthode File.GetCreationTime mais j'ai obtenu des résultats étranges: la date de la commande était 2012-05-29, mais la date de l'explorateur de fenêtres montrait 2012-05-23. Après avoir recherché cette différence, j'ai constaté que le fichier a probablement été créé le 2012-05-23 (comme indiqué par l'Explorateur Windows), mais copié dans le dossier actuel le 2012-05-29 (comme indiqué par la commande File.GetCreationTime) - donc pour être du bon côté, j'utilise la commande File.GetLastWriteTime.
Zalek
la source
LastWriteTime
, car cela reflète précisément l'heure à laquelle le fichier exécutable a été réellement mis à jour.Beaucoup de bonnes réponses ici, mais je pense pouvoir ajouter les miennes en raison de la simplicité, des performances (par rapport aux solutions liées aux ressources) multiplateforme (fonctionne également avec Net Core) et de l'évitement de tout outil tiers. Ajoutez simplement cette cible msbuild au csproj.
et maintenant vous en avez
Builtin.CompileTime
ounew DateTime(Builtin.CompileTime, DateTimeKind.Utc)
si vous en avez besoin.ReSharper ne va pas aimer ça. Vous pouvez également l'ignorer ou ajouter une classe partielle au projet, mais cela fonctionne quand même.
la source
Builtin.CompileTime
partir d'une vue Razor.BeforeTargets="RazorCoreCompile"
mais seulement pendant que c'est dans le même projetPour les projets .NET Core, j'ai adapté la réponse de Postlagerkarte pour mettre à jour le champ Copyright de l'assembly avec la date de construction.
Modifier directement csproj
Les éléments suivants peuvent être ajoutés directement au premier
PropertyGroup
dans le csproj:Alternative: Propriétés du projet Visual Studio
Ou collez l'expression interne directement dans le champ Copyright de la section Package des propriétés du projet dans Visual Studio:
Cela peut être un peu déroutant, car Visual Studio évaluera l'expression et affichera la valeur actuelle dans la fenêtre, mais il mettra également à jour le fichier de projet de manière appropriée dans les coulisses.
À l'échelle de la solution via Directory.Build.props
Vous pouvez placer l'
<Copyright>
élément ci-dessus dans unDirectory.Build.props
fichier dans la racine de votre solution et le faire appliquer automatiquement à tous les projets du répertoire, en supposant que chaque projet ne fournit pas sa propre valeur de copyright.Directory.Build.props: Personnalisez votre build
Production
L'exemple d'exemple vous donnera un copyright comme celui-ci:
Récupération
Vous pouvez afficher les informations de copyright à partir des propriétés du fichier dans Windows ou les récupérer lors de l'exécution:
la source
La méthode ci-dessus peut être modifiée pour les assemblys déjà chargés dans le processus en utilisant l'image du fichier en mémoire (par opposition à la relire à partir du stockage):
la source
Pour tous ceux qui ont besoin d'obtenir le temps de compilation sous Windows 8 / Windows Phone 8:
Pour tous ceux qui ont besoin d'obtenir le temps de compilation dans Windows Phone 7:
REMARQUE: Dans tous les cas, vous exécutez dans un bac à sable, vous ne pourrez donc obtenir que l'heure de compilation des assemblys que vous déployez avec votre application. (c'est-à-dire que cela ne fonctionnera sur rien dans le GAC).
la source
var assembly = typeof (AnyTypeInYourAssembly).GetTypeInfo().Assembly;
En 2018, certaines des solutions ci-dessus ne fonctionnent plus ou ne fonctionnent pas avec .NET Core.
J'utilise l'approche suivante qui est simple et fonctionne pour mon projet .NET Core 2.0.
Ajoutez ce qui suit à votre .csproj dans le PropertyGroup:
Cela définit une PropertyFunction à laquelle vous pouvez accéder dans votre commande de pré-génération.
Votre pré-build ressemble à ceci
Définissez la propriété de BuildTimeStamp.txt sur Ressource intégrée.
Vous pouvez maintenant lire l'horodatage comme ceci
la source
"$(ProjectDir)BuildTimeStamp.txt"
) ou elle se brisera lorsqu'il y aura des espaces dans les noms de dossier.$([System.DateTime]::Now.tostring("MM/dd/yyyy HH:mm:ss"))
au lieu de$([System.DateTime]::Now)
L'option non discutée ici est d'insérer vos propres données dans AssemblyInfo.cs, le champ "AssemblyInformationalVersion" semble approprié - nous avons quelques projets où nous faisions quelque chose de similaire en tant qu'étape de construction (mais je ne suis pas entièrement satisfait du manière qui fonctionne, donc je ne veux pas vraiment reproduire ce que nous avons).
Il y a un article sur le sujet sur codeproject: http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx
la source
J'avais besoin d'une solution universelle qui fonctionnait avec un projet NETStandard sur n'importe quelle plate-forme (iOS, Android et Windows.) Pour ce faire, j'ai décidé de générer automatiquement un fichier CS via un script PowerShell. Voici le script PowerShell:
Enregistrez le fichier PowerScript sous GenBuildDate.ps1 et ajoutez-le à votre projet. Enfin, ajoutez la ligne suivante à votre événement Pre-Build:
Assurez-vous que BuildDate.cs est inclus dans votre projet. Fonctionne comme un champion sur n'importe quel OS!
la source
Je fais juste:
la source
Vous pouvez utiliser ce projet: https://github.com/dwcullop/BuildInfo
Il utilise T4 pour automatiser l'horodatage de la date de construction. Il existe plusieurs versions (différentes branches) dont une qui vous donne le Git Hash de la branche actuellement extraite, si vous êtes dans ce genre de chose.
Divulgation: j'ai écrit le module.
la source
Une approche différente et conviviale pour PCL consisterait à utiliser une tâche en ligne MSBuild pour remplacer le temps de génération dans une chaîne renvoyée par une propriété de l'application. Nous utilisons cette approche avec succès dans une application qui a des projets Xamarin.Forms, Xamarin.Android et Xamarin.iOS.
ÉDITER:
Simplifié en déplaçant toute la logique dans le
SetBuildDate.targets
fichier et en utilisant à laRegex
place de la simple chaîne de remplacement pour que le fichier puisse être modifié par chaque build sans "reset".La définition de tâche en ligne MSBuild (enregistrée dans un fichier SetBuildDate.targets local au projet Xamarin.Forms pour cet exemple):
Appel de la tâche en ligne ci-dessus dans le fichier csproj Xamarin.Forms dans BeforeBuild cible:
La
FilePath
propriété est définie sur unBuildMetadata.cs
fichier dans le projet Xamarin.Forms qui contient une classe simple avec une propriété de chaîneBuildDate
, dans laquelle le temps de génération sera substitué:Ajoutez ce fichier
BuildMetadata.cs
au projet. Il sera modifié par chaque génération, mais d'une manière qui autorise les générations répétées (remplacements répétés), vous pouvez donc l'inclure ou l'omettre dans le contrôle de code source comme vous le souhaitez.la source
Vous pouvez utiliser un événement post-génération de projet pour écrire un fichier texte dans votre répertoire cible avec l'heure de date actuelle. Vous pouvez ensuite lire la valeur au moment de l'exécution. C'est un peu hacky, mais ça devrait marcher.
la source
Je ne suis pas sûr, mais peut-être que l' incrémenteur de build aide.
la source
Une petite mise à jour sur la réponse "New Way" de Jhon.
Vous devez créer le chemin d'accès au lieu d'utiliser la chaîne CodeBase lorsque vous travaillez avec ASP.NET/MVC
la source
Vous pouvez lancer une étape supplémentaire dans le processus de génération qui écrit un tampon de date dans un fichier qui peut ensuite être affiché.
Dans l'onglet Propriétés des projets, regardez l'onglet Événements de génération. Il y a une option pour exécuter une commande avant ou après construction.
la source
J'ai utilisé la suggestion d'Abdurrahim. Cependant, il semblait donner un format d'heure étrange et a également ajouté l'abréviation du jour dans le cadre de la date de construction; exemple: dim. 24/12/2017 13: 21: 05.43. Je n'avais besoin que de la date, j'ai donc dû éliminer le reste en utilisant une sous-chaîne.
Après avoir ajouté l'
echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"
événement à la pré-génération, je viens de faire ce qui suit:La bonne nouvelle ici est que cela a fonctionné.
la source
S'il s'agit d'une application Windows, vous pouvez simplement utiliser le chemin exécutable de l'application: new System.IO.FileInfo (Application.ExecutablePath) .LastWriteTime.ToString ("yyyy.MM.dd")
la source
il pourrait être
Assembly execAssembly = Assembly.GetExecutingAssembly(); var creationTime = new FileInfo(execAssembly.Location).CreationTime; // "2019-09-08T14:29:12.2286642-04:00"
la source