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.
¡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