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