2009-06-09 2 views
8

Je souhaite inclure l'heure et la date actuelles dans une application .net afin de pouvoir l'inclure dans le journal de démarrage pour montrer à l'utilisateur de quelle version il dispose. Est-il possible de récupérer l'heure actuelle pendant la compilation, ou devrais-je obtenir le temps de création/modification de l'exécutable?Comment puis-je trouver l'heure et la date actuelles au moment de la compilation dans l'application .net/C#?

E.g.

Bienvenue dans ApplicationX. Cela a été construit jour-mois-année à temps.

+0

est peut-être que cette question connexe a une solution pour vous: http://stackoverflow.com/questions/878037/msbuild- msbuildcommunitytasks-task-time –

+0

vous pouvez utiliser le [timestamp lien] (http://stackoverflow.com/questions/2234969/adding-compilation-date-to-the-code/2235211#2235211) – user423430

Répondre

8

Si vous utilisez le reflet pour votre numéro de build, vous pouvez l'utiliser pour savoir quand une compilation a été compilée.

Informations sur la version pour un ensemble est constitué des quatre valeurs suivantes:

  1. Version majeure
  2. Version mineure
  3. Construire Numéro
  4. Révision

Vous pouvez spécifier toutes les valeurs ou vous pouvez accepter le numéro de version par défaut, le numéro de révision ou les deux en utilisant un astérisque (*). Le numéro de build et la révision sont basés sur le 1er janvier 2000 par défaut.

L'attribut suivant définit Major et minor, mais incrémente le numéro de version et la révision.

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

vous pouvez utiliser quelque chose comme ceci:

public static DateTime CompileTime 
{ 
    get 
    { 
     System.Version MyVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 
     // MyVersion.Build = days after 2000-01-01 
     // MyVersion.Revision*2 = seconds after 0-hour (NEVER daylight saving time) 
     DateTime compileTime = new DateTime(2000, 1, 1).AddDays(MyVersion.Build).AddSeconds(MyVersion.Revision * 2);     
     return compileTime; 
    } 
} 
+0

Je pense que la date retournée est UTC. – Nick

+0

Je l'utilise actuellement avec VS2015. Il renvoie localtime, mais MinorRevision doit être casté en ushort si vous prévoyez de générer des builds après 18h12 (environ). Pour traiter DST, j'utiliserai GetDaylightChanges, mais je ne l'ai pas encore essayé. – jramos

2

Il n'y a rien dans le langage pour cela. Vous pouvez écrire une étape de préconfiguration pour écrire la date et l'heure actuelles dans un fichier source (dans un littéral de chaîne, par exemple, ou comme code source pour générer un DateTime), puis le compiler en tant que partie. de votre construction.

Je vous suggère de rendre ce fichier source aussi simple que possible, ne contenant que cette information. Sinon, pourrait éditer un fichier existant.

Pour un exemple de ceci, voir le fichier de construction pour MiscUtil qui incorpore la révision SVN en cours dans l'attribut AssemblyFileVersion. Certains bits assortis du fichier de construction:

<!-- See http://msbuildtasks.tigris.org --> 
<Import 
Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

<!-- Find out what the latest version is --> 
<SvnInfo RepositoryPath="$(SvnUrl)"> 
    <Output TaskParameter="LastChangedRevision" PropertyName="Revision" /> 
</SvnInfo> 

<!-- Update the AssemblyInfo with the revision number --> 
<FileUpdate Files="$(OutputDirectory)\MiscUtil\MiscUtil\Properties\AssemblyInfo.cs" 
      Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])' 
      ReplacementText='$1.$2.$(Revision)$5' /> 
+0

Merci pour la suggestion sur le assemblées mais c'était juste un peu plus complexe que nécessaire. Dumping info dans un fichier source est très bien. – Nick

3

La seule façon que je connaisse de le faire est un peu alambiquée -

Vous pouvez avoir un événement pré-construction qui exécute une petite application qui génère le code source sur la mouche. Un moyen simple de le faire est d'écraser un très petit fichier qui inclut une classe (ou une classe partielle) avec le jour/mois/année codé en dur comme une constante de chaîne.

Si vous définissez cette option comme un événement de préconfiguration, elle réécrira ce fichier avant chaque génération.

+0

Merci, c'est ce que j'ai fini par faire.J'ai écrit une petite application C# qui peut être exécutée comme une étape de pré-construction. – Nick

2

Vous pouvez utiliser PostSharp pour tisser la date immédiatement après la construction. PostSharp est livré avec une bibliothèque de programmation légère orientée aspect, mais il peut être étendu pour tisser tout ce dont vous avez besoin d'une grande variété de façons. Cela fonctionne au niveau IL, mais l'API vous en extrait un peu.

http://www.postsharp.org/

0

Vous pouvez mettre à jour la version Assemblée AssemblyInfo.cs dans le cadre de votre construction. Ensuite, vous pouvez faire quelque chose comme ça

FileVersionInfo lvar = FileVersionInfo.GetVersionInfo(FileName); 

FileVersionInfo a l'information (version/build, etc.) que vous recherchez. Voyez si cela fonctionne pour vous.

+0

Cela pourrait fonctionner pour signaler certaines choses à propos de l'application, mais l'OP a demandé comment obtenir la date et l'heure de construction. – JeffH

2

Dans makefile pour les programmes C, il est fréquent de voir quelque chose comme ceci:

echo char * gBuildSig ="%DATE% %TIME%"; > BuildTimestamp.c 

Et puis la résultante source C le fichier est compilé dans l'image. Ce qui précède fonctionne sur Windows car les variables% date% et% time% sont connues dans cmd.exe, mais une chose similaire fonctionnerait sous Unix en utilisant cat.

Vous pouvez faire la même chose en utilisant C#. Encore une fois, voici ce que cela donnerait si vous utilisiez un fichier makefile. Vous avez besoin d'une classe et d'une propriété statique publique.

BuildTimestamp.cs: 
    echo public static class Build { public static string Timestamp = "%DATE% %TIME%";} > BuildTimestamp.cs 

Et puis pour la chose que vous construisez, une dépendance et une suppression:

MyApp.exe: BuildTimestamp.cs MyApp.cs 
    $(_CSC) /target:exe /debug+ /optimize- /r:System.dll /out:MyApp.exe MyApp.cs BuildTimestamp.cs 
    -del BuildTimestamp.cs 

Assurez-vous de supprimer le fichier BuildTimestamp.cs après avoir compilez; vous ne voulez pas le réutiliser. Ensuite, dans votre application, référencez simplement Build.Timestamp. En utilisant MSBuild ou Visual Studio, c'est plus compliqué. Je n'ai pas pu obtenir% date% ou% time% pour résoudre. Ces choses sont des variables de pseudo-environnement, je suppose que c'est pourquoi. J'ai donc eu recours à une méthode indirecte pour obtenir un horodatage, en utilisant la tâche Touch avec AlwaysCreate = true. Cela crée un fichier vide. L'étape suivante écrit le code source dans le même fichier, référençant l'horodatage du fichier. Une torsion - j'ai dû échapper au point-virgule.

Votre étape de préconfiguration doit générer la cible "BuildTimestamp". Et assurez-vous d'inclure ce fichier dans la compilation. Et supprimez-le ensuite, dans l'étape de post-construction.

<ItemGroup> 
    <StampFile Include="BuildTimestamp.cs"/> 
</ItemGroup> 

<Target Name="BuildTimestamp" 
     Outputs="@(StampFile)"> 
    <Message Text="Building timestamp..." /> 

    <Touch 
     AlwaysCreate="true" 
     Files="@(StampFile)" /> 

    <WriteLinesToFile 
     File="@(StampFile)" 
     Lines='public static class Build { public static string Timestamp = "%(StampFile.CreatedTime)" %3B }' 
     Overwrite="true" /> 

</Target> 
0

Salut, j'utilisé la méthode suivante pour le même ...

private DateTime ExecutableInfo() 
{ 
    System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath.Trim()); 
    try 
    { 
    return fi.CreationTime; 
    } 
    catch (Exception ex) 
    { 
    throw ex; 
    } 
    finally 
    { 
    fi = null; 
    } 
} 
Questions connexes