Jalan
Seperti yang ditunjukkan oleh @ c00000fd dalam komentar . Microsoft mengubah ini. Dan sementara banyak orang tidak menggunakan versi terbaru dari kompiler mereka, saya curiga perubahan ini membuat pendekatan ini menjadi buruk. Dan walaupun ini adalah latihan yang menyenangkan, saya akan merekomendasikan orang-orang untuk menanamkan tanggal pembuatan ke dalam biner mereka melalui cara lain yang diperlukan jika penting untuk melacak tanggal pembuatan dari biner itu sendiri.
Ini dapat dilakukan dengan beberapa pembuatan kode sepele yang mungkin merupakan langkah pertama dalam skrip build Anda. Itu, dan fakta bahwa alat ALM / Build / DevOps banyak membantu dengan ini dan harus lebih disukai daripada yang lain.
Saya meninggalkan sisa jawaban ini di sini hanya untuk tujuan historis.
Cara baru
Saya berubah pikiran tentang ini, dan saat ini menggunakan trik ini untuk mendapatkan tanggal pembuatan yang benar.
#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
Cara lama
Nah, bagaimana Anda menghasilkan angka membangun? Visual Studio (atau kompiler C #) benar-benar memberikan angka pembuatan dan revisi otomatis jika Anda mengubah atribut AssemblyVersion ke mis.1.0.*
Apa yang akan terjadi adalah bahwa bangunannya akan sama dengan jumlah hari sejak 1 Januari 2000 waktu setempat, dan untuk revisi sama dengan jumlah detik sejak tengah malam waktu setempat, dibagi 2.
lihat Konten Komunitas, Nomor Pembuatan dan Revisi Otomatis
mis. 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)