2014-11-22 4 views
0

Я хотел бы иметь константу или поле, определенные в моем стартовом коде приложения, которые отражают дату, когда приложение было фактически построено. Нечто подобное, например:Установка значения константы или переменной во время сборки

Private Shared ApplicationBuiltOn As Date = <and here is where I would like to set the build date>` 

Может ли это быть сделано с помощью построить события, так что он всегда установлен, и я активно не должен помнить, чтобы сделать это до активно строит версию выпуска.

Если возможно, как это сделать? Я прочитал документацию msdn по событиям сборки, но, похоже, ничего не скрывает, что я хотел бы попробовать и сделать.

+0

My. Настройки будут работать ... – Codexer

+0

Как это будет работать в этой ситуации. Как я вижу, вы в конечном итоге будете использовать что-то вроде ApplicationBuildDate = Now, которое всегда будет разрешено к дате, когда оно проверяется не фактической датой сборки. –

+1

Я не знаю, может ли VS записывать DateTimes в качестве значений переменных с использованием макросов (или помещать их в файл ressource). Но вы можете [взглянуть на это ..] (http://blog.codinghorror.com/determining-build-date-the-hard-way/) –

ответ

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()) 

ПРИМЕЧАНИЕ: Захваченный вместе с https://stackoverflow.com/a/3634544/4237809 и http://blog.codinghorror.com/determining-build-date-the-hard-way/

+0

Привет, Рой, работает очень хорошо, Большое спасибо. –

+0

YW благодарит за отзыв и изречения благодаря оригинальным авторам (-ам) :-) –

Смежные вопросы