방법
의견 에서 @ c00000fd가 지적한대로 . 마이크로 소프트는 이것을 바꾸고있다. 많은 사람들이 최신 버전의 컴파일러를 사용하지 않지만이 변경으로 인해이 접근법이 의심 할 여지없이 나쁘다고 생각합니다. 그리고 재미있는 연습이지만 사람들이 바이너리 자체의 빌드 날짜를 추적하는 것이 중요하다면 필요한 다른 수단을 통해 빌드 날짜를 바이너리에 간단히 삽입하는 것이 좋습니다.
이것은 아마도 빌드 스크립트의 첫 번째 단계 일 수있는 사소한 코드 생성으로 수행 될 수 있습니다. ALM / Build / DevOps 도구는이 기능에 많은 도움이되며 다른 것보다 선호되어야합니다.
나는이 답변의 나머지 부분을 역사적인 목적으로 여기에 남겨 둡니다.
새로운 길
나는 이것에 대해 마음이 바뀌었고 현재이 트릭을 사용하여 올바른 빌드 날짜를 얻습니다.
#region Gets the build date and time (by reading the COFF header)
// http://msdn.microsoft.com/en-us/library/ms680313
struct _IMAGE_FILE_HEADER
{
public ushort Machine;
public ushort NumberOfSections;
public uint TimeDateStamp;
public uint PointerToSymbolTable;
public uint NumberOfSymbols;
public ushort SizeOfOptionalHeader;
public ushort Characteristics;
};
static DateTime GetBuildDateTime(Assembly assembly)
{
var path = assembly.GetName().CodeBase;
if (File.Exists(path))
{
var buffer = new byte[Math.Max(Marshal.SizeOf(typeof(_IMAGE_FILE_HEADER)), 4)];
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
fileStream.Position = 0x3C;
fileStream.Read(buffer, 0, 4);
fileStream.Position = BitConverter.ToUInt32(buffer, 0); // COFF header offset
fileStream.Read(buffer, 0, 4); // "PE\0\0"
fileStream.Read(buffer, 0, buffer.Length);
}
var pinnedBuffer = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
var coffHeader = (_IMAGE_FILE_HEADER)Marshal.PtrToStructure(pinnedBuffer.AddrOfPinnedObject(), typeof(_IMAGE_FILE_HEADER));
return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1) + new TimeSpan(coffHeader.TimeDateStamp * TimeSpan.TicksPerSecond));
}
finally
{
pinnedBuffer.Free();
}
}
return new DateTime();
}
#endregion
옛날 방식
글쎄, 어떻게 빌드 번호를 생성합니까? AssemblyVersion 특성을 다음과 같이 변경하면 Visual Studio (또는 C # 컴파일러)는 실제로 자동 빌드 및 수정 번호를 제공합니다.1.0.*
일어날 일은 2000 년 1 월 1 일 현지 시간 이후의 일 수와 같고 수정이 현지 시간 자정 이후의 초 수와 2로 나눈 것입니다.
커뮤니티 컨텐츠, 자동 빌드 및 개정 번호 참조
예 : AssemblyInfo.cs
[assembly: AssemblyVersion("1.0.*")] // important: use wildcard for build and revision numbers!
SampleCode.cs
var version = Assembly.GetEntryAssembly().GetName().Version;
var buildDateTime = new DateTime(2000, 1, 1).Add(new TimeSpan(
TimeSpan.TicksPerDay * version.Build + // days since 1 January 2000
TimeSpan.TicksPerSecond * 2 * version.Revision)); // seconds since midnight, (multiply by 2 to get original)