2009-06-09 28 views
8

Quiero incluir la hora y la fecha actuales en una aplicación .net para poder incluirla en el registro de inicio para mostrarle al usuario la versión que tienen. ¿Es posible recuperar la hora actual durante la compilación o tendré que obtener el tiempo de creación/modificación del ejecutable?¿Cómo encuentro la hora y fecha actual en el momento de la compilación en la aplicación .net/C#?

E.g.

Bienvenido a ApplicationX. Esto fue construido día-mes-año en tiempo.

+0

podría ser que esta cuestión relacionada tiene una solución para usted: http://stackoverflow.com/questions/878037/msbuild- msbuildcommunitytasks-task-time –

+0

puede usar la [indicación de fecha y hora del enlazador] (http://stackoverflow.com/questions/2234969/adding-compilation-date-to-the-code/2235211#2235211) – user423430

Respuesta

8

Si está utilizando el reflejo para su número de compilación, puede usarlo para determinar cuándo se compiló una compilación.

la información de versión de un ensamblado consta de los siguientes cuatro valores:

  1. versión principal
  2. Versión secundaria
  3. número de compilación
  4. Revisión

Puede especificar todos los valores o puede aceptar el número de versión predeterminado, el número de revisión o ambos utilizando un asterisco (*). El número de compilación y la revisión se basan en el 1 de enero de 2000 de forma predeterminada.

El siguiente atributo establecerá Mayor y menor, pero luego incrementará el número de compilación y la revisión.

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

A continuación, se puede usar algo como esto:

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

Creo que la fecha devuelta es UTC. – Nick

+0

Actualmente estoy usando eso con VS2015. Devuelve localtime, pero MinorRevision debe enviarse a ushort si planea generar compilaciones después de las 18:12 (aproximadamente). Para manejar el horario de verano, usaré GetDaylightChanges, pero aún no lo intenté. – jramos

2

No hay nada integrado en el lenguaje para hacer esto.

Puede escribir un paso de preconstrucción para escribir la fecha y hora actuales en un archivo fuente (por ejemplo, en un literal de cadena o como código fuente para generar un DateTime), y luego compilar eso como parte de tu construcción.

Le sugiero que haga este archivo fuente tan simple como sea posible, que no contenga nada más que esta información. Alternativamente, podría editar un archivo existente.

Para ver un ejemplo de esto, consulte el archivo de compilación para MiscUtil que incorpora la revisión de SVN actual en el atributo AssemblyFileVersion. Algunos bits surtidos del fichero de construcción:

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

Gracias por la sugerencia sobre la asambleas, pero eso fue solo un poco más complejo de lo que necesitaba. Descargar información en un archivo fuente está bien. – Nick

3

La única forma que conozco de hacer esto es algo complicado -

Puede tener un evento de pre-construcción que dirige una pequeña aplicación que genera el código fuente en la mosca. Una manera fácil de hacerlo es sobrescribir un archivo muy pequeño que incluye una clase (o clase parcial) con el día/mes/año codificado como una constante de cadena.

Si configura esto para que se ejecute como un evento de preconstrucción, reescribirá ese archivo antes de cada compilación.

+0

Gracias, esto es lo que terminé haciendo.Escribí una pequeña aplicación de C# que se puede ejecutar como un paso previo a la compilación. – Nick

2

Puede usar PostSharp para tejer en la fecha inmediatamente posterior a la construcción. PostSharp viene con una biblioteca ligera de programación orientada a aspectos, pero puede ampliarse para tejer todo lo que necesite en una amplia variedad de formas. Funciona en el nivel IL, pero la API lo abstrae un poco de eso.

http://www.postsharp.org/

0

Se puede actualizar la versión Asamblea en AssemblyInfo.cs como parte de su construcción. Posteriormente, se podría hacer algo como esto

FileVersionInfo lvar = FileVersionInfo.GetVersionInfo(FileName); 

FileVersionInfo tiene la información (build/versión, etc) que usted busca. Vea si esto funciona para usted.

+0

Eso podría funcionar para informar algunas cosas sobre la aplicación, pero el OP preguntó cómo obtener la fecha y hora de compilación. – JeffH

2

En los archivos make para programas en C, es común ver algo como esto:

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

Y luego la fuente de C, como consecuencia el archivo se compila en la imagen. Lo anterior funciona en Windows porque las variables% date% y% time% son conocidas en cmd.exe, pero una cosa similar funcionaría en Unix usando cat.

Puede hacer lo mismo con C#. Una vez más, así es como se vería si está usando un archivo MAKE. Necesitas una clase y una propiedad pública estática.

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

Y entonces, por lo que usted está construyendo, una dependencia y una eliminación:

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

Asegúrese de eliminar el archivo BuildTimestamp.cs tras compilarla; no quieres volver a usarlo Luego, en su aplicación, simplemente haga referencia a Build.Timestamp.

El uso de MSBuild o Visual Studio es más complicado. No pude obtener% date% o% time% para resolver. Esas cosas son pseudo variables de entorno, supongo que es por eso. Así que recurrí a una forma indirecta de obtener una marca de tiempo, usando la tarea Touch con AlwaysCreate = true. Eso crea un archivo vacío. El siguiente paso escribe el código fuente en el mismo archivo, haciendo referencia a la marca de tiempo del archivo. Una vuelta de tuerca: tuve que escapar del punto y coma.

Su paso previo a la compilación debería generar el objetivo "BuildTimestamp". Y asegúrese de incluir ese archivo en la compilación. Y elimínelo después, en el paso posterior a la compilación.

<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

Hola utilizados siguiendo el mismo método para ...

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