रास्ता
जैसा कि टिप्पणियों में @ 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
पुराना तरीका है
खैर, आप बिल्ड नंबर कैसे उत्पन्न करते हैं? दृश्य स्टूडियो (या C # संकलक) वास्तव में स्वत: बिल्ड और संशोधन संख्या प्रदान करता है यदि आप असेंबली के लिए विधानसभा विशेषता को बदलते हैं1.0.*
क्या होगा कि यह है कि निर्माण 1 जनवरी, 2000 के स्थानीय दिनों के बाद की संख्या के बराबर होगा, और संशोधन के लिए स्थानीय समय के मध्य सेकंड के बाद की संख्या के बराबर, 2 से विभाजित होगा।
सामुदायिक सामग्री देखें, स्वचालित बिल्ड और संशोधन संख्या देखें
जैसे कि असेम्बलीइन्फो
[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)