I recently came across a function for determining the date and time a .NET assembly was compiled on. This works for EXEs and DLLs.
Apparently, the date and time that the compiled objects of an assembly are linked together is stored in the header of the final output as a count of the number of seconds that have elapsed since midnight on Jan 1, 1970. Here’s the function that reads this information from the file header and returns it as a DateTime variable:
''' <summary> ''' Returns the date and time that the specified assembly was compiled on. ''' </summary> ''' <param name="filePath">A full path to a .NET assembly.</param> ''' <returns>A DateTime value.</returns> Function RetrieveLinkerTimestamp(ByVal filePath As String) As DateTime Const PortableExecutableHeaderOffset As Integer = 60 Const LinkerTimestampOffset As Integer = 8 Dim b(2047) As Byte Dim s As IO.Stream = Nothing Try s = New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read) s.Read(b, 0, 2048) Finally If Not s Is Nothing Then s.Close() End Try Dim i As Integer = BitConverter.ToInt32(b, PortableExecutableHeaderOffset) Dim secondsSince1970 As Integer = BitConverter.ToInt32(b, i + LinkerTimestampOffset) Dim dt As New DateTime(1970, 1, 1, 0, 0, 0) dt = dt.AddSeconds(secondsSince1970) dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours) Return dt End Function
I found this function at http://www.codinghorror.com/blog/2005/04/determining-build-date-the-hard-way.html
For more info, check out http://msdn.microsoft.com/en-us/library/ms680313