Это может быть слишком поздно, чтобы быть полезным, но, возможно, это поможет кому-то еще.
Вы можете добавить эту цель в свой файл 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, поэтому, если вам требуется поддержка версии, предшествующей этой, вы можете просто определить собственный тип настраиваемого атрибута для хранения даты. значение.