Установка значения константы или переменной во время сборки
Я хотел бы, чтобы в моем коде запуска приложения были определены константа или поле, которые отражают дату, когда приложение было фактически построено. Что-то вроде например:
Private Shared ApplicationBuiltOn As Date = <and here is where I would like to set the build date>`
Можно ли это сделать с помощью событий сборки, чтобы он всегда был установлен, и мне не нужно активно помнить, чтобы сделать это, прежде чем активно создавать версию выпуска.
Если это возможно, как это сделать? Я прочитал документацию msdn о событиях сборки, но, кажется, ничто не покрывает то, что я хотел бы попробовать.
1 ответ
Решение
Вы можете попробовать это (проверил и работал на меня)
Public NotInheritable Class ApplicationInformation
Private Sub New()
End Sub
''' <summary>
''' Gets the executing assembly.
''' </summary>
''' <value>The executing assembly.</value>
Public Shared ReadOnly Property ExecutingAssembly() As System.Reflection.Assembly
Get
Return If(m_executingAssembly, (InlineAssignHelper(m_executingAssembly, System.Reflection.Assembly.GetExecutingAssembly())))
End Get
End Property
Private Shared m_executingAssembly As System.Reflection.Assembly
''' <summary>
''' Gets the executing assembly version.
''' </summary>
''' <value>The executing assembly version.</value>
Public Shared ReadOnly Property ExecutingAssemblyVersion() As System.Version
Get
Return If(m_executingAssemblyVersion, (InlineAssignHelper(m_executingAssemblyVersion, ExecutingAssembly.GetName().Version)))
End Get
End Property
Private Shared m_executingAssemblyVersion As System.Version
''' <summary>
''' Gets the compile date of the currently executing assembly.
''' </summary>
''' <value>The compile date.</value>
Public Shared ReadOnly Property CompileDate() As System.DateTime
Get
If Not m_compileDate.HasValue Then
m_compileDate = RetrieveLinkerTimestamp(ExecutingAssembly.Location)
End If
Return If(m_compileDate, New System.DateTime())
End Get
End Property
Private Shared m_compileDate As System.Nullable(Of System.DateTime)
''' <summary>
''' Retrieves the linker timestamp.
''' </summary>
''' <param name="filePath">The file path.</param>
''' <returns></returns>
''' <remarks>http://www.codinghorror.com/blog/2005/04/determining-build-date-the-hard-way.html</remarks>
Private Shared Function RetrieveLinkerTimestamp(filePath As String) As System.DateTime
Const peHeaderOffset As Integer = 60
Const linkerTimestampOffset As Integer = 8
Dim b = New Byte(2047) {}
Dim s As System.IO.FileStream = Nothing
Try
s = New System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
s.Read(b, 0, 2048)
Finally
If s IsNot Nothing Then
s.Close()
End If
End Try
Dim dt = New System.DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(System.BitConverter.ToInt32(b, System.BitConverter.ToInt32(b, peHeaderOffset) + linkerTimestampOffset))
Return dt.AddHours(System.TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours)
End Function
Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
target = value
Return value
End Function
End Class
И используйте это так:
Messagebox.Show("This application was built on: " & ApplicationInformation.CompileDate.ToString())
ПРИМЕЧАНИЕ: собраны вместе с /questions/14560628/poluchenie-datyi-sborkinet/14560636#14560636 и http://blog.codinghorror.com/determining-build-date-the-hard-way/