วิธีการ
ในฐานะที่เป็นแหลมออกโดย @ c00000fd ในการแสดงความคิดเห็น Microsoft กำลังเปลี่ยนแปลงสิ่งนี้ และในขณะที่หลายคนไม่ได้ใช้คอมไพเลอร์เวอร์ชันล่าสุดฉันสงสัยว่าการเปลี่ยนแปลงนี้จะทำให้วิธีการนี้ไม่ดีอย่างแน่นอน และในขณะที่มันเป็นแบบฝึกหัดที่สนุกฉันขอแนะนำให้ผู้ใช้เพียงฝังวันที่สร้างลงในไบนารีของพวกเขาด้วยวิธีการอื่นที่จำเป็นถ้ามันเป็นสิ่งสำคัญในการติดตามวันที่สร้างของตัวไบนารี
สิ่งนี้สามารถทำได้ด้วยการสร้างรหัสเล็ก ๆ น้อย ๆ ซึ่งอาจเป็นขั้นตอนแรกในการสร้างสคริปต์ของคุณแล้ว และความจริงที่ว่าเครื่องมือ 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
วิธีเก่า ๆ
คุณจะสร้างหมายเลขบิลด์ได้อย่างไร Visual Studio (หรือคอมไพเลอร์ C #) จะให้หมายเลขบิวด์และการแก้ไขอัตโนมัติหากคุณเปลี่ยนแอททริบิวต์ AssemblyVersion เป็นเช่น1.0.*
สิ่งที่จะเกิดขึ้นก็คือการสร้างจะเท่ากับจำนวนวันตั้งแต่วันที่ 1 มกราคม 2000 เวลาท้องถิ่นและสำหรับการแก้ไขจะเท่ากับจำนวนวินาทีตั้งแต่เวลาท้องถิ่นเที่ยงคืนหารด้วย 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)