রাস্তা
হিসাবে @ c00000fd দ্বারা নির্দিষ্ট মন্তব্য । মাইক্রোসফ্ট এটি পরিবর্তন করছে। এবং যখন অনেকে তাদের সংকলকটির সর্বশেষতম সংস্করণ ব্যবহার করেন না তখন আমার সন্দেহ হয় যে এই পরিবর্তনটি এই পদ্ধতির সন্দেহাতীত খারাপ করেছে। এবং এটি একটি মজাদার অনুশীলনের সময় আমি বাইনারি নিজেই তৈরির তারিখটি ট্র্যাক করা যদি গুরুত্বপূর্ণ হয় তবে অন্য যে কোনও উপায়ের মাধ্যমে লোকদের কেবল বাইনারিতে কোনও বিল্ড ডেট এম্বেড করার জন্য সুপারিশ করব।
এটি কিছু তুচ্ছ কোড উত্পাদন সহ করা যেতে পারে যা সম্ভবত আপনার বিল্ড স্ক্রিপ্টের ইতিমধ্যে ইতিমধ্যে প্রথম পদক্ষেপ। এটি এবং এএলএম / বিল্ড / ডিভোপস সরঞ্জামগুলি এর সাথে অনেক সহায়তা করে এবং অন্য যে কোনও কিছুর চেয়ে অগ্রাধিকার দেওয়া উচিত।
আমি এই উত্তরটি এখানে কেবল historicalতিহাসিক উদ্দেশ্যে ছেড়ে চলেছি।
নতুন উপায়
আমি এই সম্পর্কে আমার মতামত পরিবর্তন করেছি, এবং বর্তমানে সঠিক কৌশলটির তারিখ পেতে এই কৌশলটি ব্যবহার করছি।
#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
পুরানো উপায়
আচ্ছা, আপনি কীভাবে বিল্ড নম্বর তৈরি করবেন? ভিজ্যুয়াল স্টুডিও (বা সি # সংকলক) আসলে আপনি স্বয়ংক্রিয় বিল্ড এবং সংশোধন নম্বরগুলি সরবরাহ করে যদি আপনি অ্যাসেম্বলিভিশন বৈশিষ্ট্যটিকে উদাহরণস্বরূপ পরিবর্তন করেন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)