espoir pleinement le titre était quelque peu descriptif. p>
J'ai une application WinForm écrite en C # avec .NET 2.0. J'aimerais avoir la dernière date de compilation automatiquement mise à jour à une variable pour une utilisation dans la case à propos de la boîte à propos de la boîte à propos de la case initiale. Actuellement, j'ai une variable de chaîne que je me met à jour manuellement. Y a-t-il un moyen de faire cela? P>
vs2008 .NET 2.0 c # p>
5 Réponses :
Il n'y a pas de macro intégrée ou similaire pour cela. Votre meilleur pari pourrait être une tâche de construction personnalisée, telle que sur Tigris , à l'aide de l'heure Code> Tâche et Regexreplace CODE> ou similaire. Pas simple à avoir raison. Personnellement, j'utilise la version du référentiel pour mettre à jour AssemblyInfo - largement associé? <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
<Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
<FileUpdate Files="protobuf-net\Properties\AssemblyInfo.cs"
Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
ReplacementText='$1.$2.$(BuildRev)$5' />
Je ne suis pas d'accord avec cette approche uniquement parce que je crois que la construction ne doit pas muté les fichiers source.
Une autre astuce (laquelle vous ne pouvez pas être en mesure d'utiliser) est d'exploiter les numéros de construction et de révision automatiques générés par .NET. Si votre associationInfo a: Les deux derniers chiffres ne sont qu'un timbre de date / heure. Certains code (liste ci-dessous) peuvent aider: P> Version v = Assembly.GetExecutingAssembly().GetName().Version;
DateTime compileDate = new DateTime((v.Build - 1) * TimeSpan.TicksPerDay + v.Revision * TimeSpan.TicksPerSecond * 2).AddYears(1999);
Il faut se méfier ! Ce code ne fonctionne pas lorsque vous construisez quelque chose le 11 mars 2012 (en raison d'une année bissextile?): Il retourne le 12 mars au lieu du 11 mars.
J'ai utilisé Ceci à propos de la boîte à partir de codeProject.com. C'était en fait écrit par Jeff Satwood Way en 2004. Il figure le temps de compilation en examinant le cachet de la date dans le fichier d'assemblage ou en le calculant de la version de montage. Peut-être pourriez-vous extraire le code pertinent de là. P>
Posez cela dans vos événements de pré-construction; Il crée une classe appelée Datestamp comme ceci; p> et vous utilisez C'est comme ça; p>
Comment puis-je l'obtenir pour reconnaître "horodatage" avant de construire? Je reçois l'erreur ... Le nom 'Timeestamp' n'existe pas dans le contexte actuel
Ah, à droite. Le fichier (Datestamp.cs) sera dans le dossier racine de votre projet. Dans VS, accédez à l'explorateur de la solution et cliquez sur le bouton indiquant tous les fichiers, y compris ceux qui ne sont pas actuellement dans votre projet. Trouvez Datestamp.cs, cliquez dessus avec le bouton droit de la souris et choisissez «Inclure dans le projet». Vous devriez maintenant trouver qu'il construit dans le cadre de votre projet.
Cela pourrait être une décennie trop tard pour être utile, mais peut-être que cela aidera quelqu'un d'autre.
Vous pouvez ajouter cette cible à votre fichier CSPROJ, juste la coller à la fin: p>
using System;
using System.Linq;
using System.Reflection;
public class Application
{
static DateTime BuildDate;
public static DateTime GetBuildDate()
{
if (BuildDate == default(DateTime)) {
var attr = typeof(Application).Assembly.GetCustomAttributes<AssemblyMetadataAttribute>();
var dateStr = attr.Single(a => a.Key == "AssemblyDate")?.Value;
BuildDate = DateTime.Parse(dateStr);
}
return BuildDate;
}
}
Cette solution est géniale ... mais je l'utilise dans un projet héritier ASP.NET WebForms et il semble casser des constructions "Publier" (VS se plaint des arguments manquants pour assemblymetatataattribute code>) - mais l'étrange La chose est que si je fais d'abord une première génération normale, et alors i> faire une publication construit cela fonctionne. Bizarre.
Cela obtient: System.InvalidoperationException: 'Séquence ne contient aucun élément de correspondance'