Cách
Như được chỉ ra bởi @ c00000fd trong các bình luận . Microsoft đang thay đổi điều này. Và trong khi nhiều người không sử dụng phiên bản mới nhất của trình biên dịch của họ, tôi nghi ngờ sự thay đổi này làm cho cách tiếp cận này không thể nghi ngờ là xấu. Và trong khi đó là một bài tập thú vị, tôi khuyên mọi người chỉ nên nhúng ngày xây dựng vào nhị phân của mình thông qua bất kỳ phương tiện nào khác cần thiết nếu điều quan trọng là theo dõi ngày xây dựng của chính nhị phân.
Điều này có thể được thực hiện với một số thế hệ mã tầm thường có lẽ là bước đầu tiên trong tập lệnh xây dựng của bạn. Điều đó, và thực tế là các công cụ ALM / Build / DevOps giúp ích rất nhiều cho việc này và nên được ưu tiên hơn bất cứ điều gì khác.
Tôi để phần còn lại của câu trả lời này ở đây chỉ cho mục đích lịch sử.
Cách mới
Tôi đã thay đổi suy nghĩ về điều này và hiện đang sử dụng thủ thuật này để có được ngày xây dựng chính xác.
#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
Cách cũ
Làm thế nào để bạn tạo số xây dựng? Visual Studio (hoặc trình biên dịch C #) thực sự cung cấp các số sửa đổi và xây dựng tự động nếu bạn thay đổi thuộc tính AssociationVersion thành vd1.0.*
Điều sẽ xảy ra là việc xây dựng sẽ bằng số ngày kể từ ngày 1 tháng 1 năm 2000 và để sửa đổi bằng với số giây kể từ nửa đêm theo giờ địa phương, chia cho 2.
xem Nội dung cộng đồng, số bản dựng và sửa đổi tự động
ví dụ: HộiInfo.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)