2009-12-14 8 views
9

Espero que el título sea algo descriptivo.¿Cómo tengo automáticamente la fecha de compilación insertada en el momento del diseño

Tengo una aplicación de winform escrita en C# con .net 2.0. Me gustaría que la última fecha de compilación se actualice automáticamente a una variable para usar en el cuadro Acerca de y en el cuadro de bienvenida inicial. Actualmente tengo una variable de cadena que actualizo manualmente. ¿Hay alguna manera de hacer esto?

VS2008 .NET 2.0 C#

Respuesta

5

Otro truco (que puede no ser capaz de usar) es aprovechar los números de compilación y revisión automáticas generadas por NET. Si su AssemblyInfo tiene:

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

Los dos últimos números son solo un sello de fecha/hora. Parte del código (lista a continuación) puede ayudar:

Version v = Assembly.GetExecutingAssembly().GetName().Version; 
DateTime compileDate = new DateTime((v.Build - 1) * TimeSpan.TicksPerDay + v.Revision * TimeSpan.TicksPerSecond * 2).AddYears(1999); 

Editar: esta es una respuesta alternativa que puede ser un poco más claro a seguir que lo que he puesto: https://stackoverflow.com/a/804895/2258

+1

¡Cuidado! Este código no funciona cuando construyes algo el 11 de marzo de 2012 (¿por año bisiesto?): Vuelve el 12 de marzo en lugar del 11 de marzo. – JYL

0

No hay ninguna macro incorporado o similar para esto. Su mejor opción podría ser una tarea de compilación personalizada, como en tigris, utilizando la tarea Time y RegexReplace o similar. No es fácil de hacer bien. Personalmente, uso la versión del repositorio para actualizar AssemblyInfo, ¿está ampliamente relacionado?

<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' /> 
+0

No estoy de acuerdo con este enfoque solo porque creo que la construcción no debe mutar los archivos fuente. – MarkPflug

1

que utilizan this about box de codeproject.com. En realidad, fue escrito por Jeff Atwood en 2004. Calcula el tiempo de compilación observando el sello de fecha en el archivo de ensamblaje o calculándolo desde la versión de ensamblaje. Quizás puedas extraer el código relevante de allí.

2

Pop esto en sus eventos de preconstrucción;

echo public static class DateStamp { public readonly static System.DateTime BuildTime = System.DateTime.Parse("%date%"); } > $(ProjectDir)DateStamp.cs 

Crea una clase llamada DateStamp como esta;

public static class DateStamp 
{ 
    public readonly static System.DateTime BuildTime = System.DateTime.Parse("14/12/2009"); 
} 

Y lo usa así;

Console.WriteLine("Build on " + DateStamp.BuildTime.ToShortDateString()); 
+0

¿cómo consigo que reconozca "DateStamp" antes de compilar? Me sale el error ... El nombre 'DateStamp' no existe en el contexto actual – Brad

+0

Ah, a la derecha. El archivo (DateStamp.cs) estará en la carpeta raíz de su proyecto. En VS, vaya al explorador de soluciones y haga clic en el botón que muestra todos los archivos, incluidos los que no están actualmente en su proyecto. Busque DateStamp.cs, haga clic con el botón derecho y elija 'incluir en proyecto'. Ahora debería encontrarlo compila como parte de su proyecto. –

1

Esto puede ser una década demasiado tarde para ser útil, pero tal vez ayudará a otra persona.

Puede añadir este objetivo a su archivo csproj, justo en la pasta al final:

<Target Name="BuildDate" BeforeTargets="CoreCompile"> 
    <PropertyGroup> 
     <SharedAssemblyInfoFile>$(IntermediateOutputPath)CustomAssemblyInfo.cs</SharedAssemblyInfoFile> 
    </PropertyGroup> 
    <ItemGroup> 
     <Compile Include="$(SharedAssemblyInfoFile)" /> 
    </ItemGroup> 
    <ItemGroup> 
     <AssemblyAttributes Include="AssemblyMetadata"> 
     <_Parameter1>AssemblyDate</_Parameter1> 
     <_Parameter2>$([System.DateTime]::UtcNow.ToString("u"))</_Parameter2> 
     </AssemblyAttributes> 
    </ItemGroup> 
    <WriteCodeFragment Language="C#" OutputFile="$(SharedAssemblyInfoFile)" AssemblyAttributes="@(AssemblyAttributes)" /> 
    </Target> 

Esto creará un archivo en la carpeta de CustomAssemblyInfo.cs "obj", que contiene una sola línea: [assembly: AssemblyMetadata("AssemblyDate", "DATE_OF_BUILD_HERE")] Este archivo se compila en su montaje, para que pueda acceder a él en tiempo de ejecución utilizando la reflexión, como por ejemplo con el siguiente código:

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

Una cosa a destacar, el AssemblyMetadataAttribute que estoy usando aquí fue sólo agregado en .NET 4.5.3, por lo que si necesita admitir una versión anterior, simplemente puede definir su propio tipo de atributo personalizado para mantener el valor de la fecha.

Cuestiones relacionadas