Это может быть слишком долгое десятилетие, чтобы быть полезным, но, возможно, это поможет кому-то еще.
Вы можете добавить эту цель в файл csproj, просто вставьте его в конце:
<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>
Это создаст файл CustomAssemblyInfo.cs в папку «Obj», который содержит одну строку: [assembly: AssemblyMetadata("AssemblyDate", "DATE_OF_BUILD_HERE")]
Этот файл будет скомпилирован в сборку, так что вы можете получить доступ к нему во время выполнения с помощью отражения, например, с помощью следующего кода:
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;
}
}
Одно замечание, тем AssemblyMetadataAttribute, что я использую здесь только добавлено в .NET 4.5.3, поэтому, если вам нужно поддерживать предыдущую версию, вы можете просто определить свой собственный тип атрибута, чтобы сохранить значение даты.
Остерегайтесь! Этот код не работает, когда вы что-то создаете 11 марта 2012 года (из-за високосного года?): Он возвращается 12 марта, а не 11 марта. – JYL