Yol
Yorumlarda @ c00000fd tarafından işaret edildiği gibi . Microsoft bunu değiştiriyor. Birçok kişi derleyicilerinin en son sürümünü kullanmasa da, bu değişikliğin bu yaklaşımı tartışmasız kötü hale getirdiğinden şüpheleniyorum. Ve eğlenceli bir alıştırma olsa da, ikilinin kendisinin derleme tarihini izlemek önemliyse, gerekli olan diğer yollarla ikili bir tarih oluşturma.
Bu, büyük olasılıkla derleme kodunuzda ilk adım olan bazı önemsiz kod üretimi ile yapılabilir. Bu ve ALM / Build / DevOps araçlarının bu konuda çok yardımcı olması ve başka herhangi bir şeye tercih edilmesi gerekir.
Bu cevabın geri kalanını burada sadece tarihi amaçlar için bırakıyorum.
Yeni yol
Bu konuda fikrimi değiştirdim ve şu anda doğru yapım tarihini almak için bu hileyi kullanıyorum.
#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
Eski yol
Yapı sayılarını nasıl üretiyorsunuz? AssemblyVersion özniteliğini örn. Olarak değiştirirseniz, Visual Studio (veya C # derleyicisi) aslında otomatik derleme ve düzeltme numaraları sağlar.1.0.*
Olan şey şu ki, yapı 1 Ocak 2000 yerel saatinden bu yana geçen gün sayısına eşit olacak ve revizyonun gece yarısı yerel saatinden bu yana saniye sayısına eşit olacağı, 2'ye bölünecek.
Topluluk İçeriği, Otomatik Derleme ve Düzeltme numaralarına bakın
Örneğin, 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)