Подтвердить что ты не робот

Получение даты сборки .NET

Как я могу получить созданную дату из текущей сборки .NET?

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

4b9b3361

Ответ 1

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

File.GetCreationTime(Assembly.GetExecutingAssembly().Location)

должен сделать трюк.

EDIT:

Я думаю, что решение Джеффа Этвуда, написанное "гранатой" в этой теме, вероятно, лучший способ пойти сейчас.

Ответ 2

На основе: https://blog.codinghorror.com/determining-build-date-the-hard-way/

public static class ApplicationInformation
{
    /// <summary>
    /// Gets the executing assembly.
    /// </summary>
    /// <value>The executing assembly.</value>
    public static System.Reflection.Assembly ExecutingAssembly
    {
        get { return executingAssembly ?? (executingAssembly = System.Reflection.Assembly.GetExecutingAssembly()); }
    }
    private static System.Reflection.Assembly executingAssembly;

    /// <summary>
    /// Gets the executing assembly version.
    /// </summary>
    /// <value>The executing assembly version.</value>
    public static System.Version ExecutingAssemblyVersion
    {
        get { return executingAssemblyVersion ?? (executingAssemblyVersion = ExecutingAssembly.GetName().Version); }
    }
    private static System.Version executingAssemblyVersion;

    /// <summary>
    /// Gets the compile date of the currently executing assembly.
    /// </summary>
    /// <value>The compile date.</value>
    public static System.DateTime CompileDate
    {
        get
        {
            if (!compileDate.HasValue)
                compileDate = RetrieveLinkerTimestamp(ExecutingAssembly.Location);
            return compileDate ?? new System.DateTime();
        }
    }
    private static System.DateTime? compileDate;

    /// <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 static System.DateTime RetrieveLinkerTimestamp(string filePath)
    {
        const int peHeaderOffset = 60;
        const int linkerTimestampOffset = 8;
        var b = new byte[2048];
        System.IO.FileStream s = null;
        try
        {
            s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            s.Read(b, 0, 2048);
        }
        finally
        {
            if(s != null)
                s.Close();
        }
        var 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);
    }
}

Ответ 3

Что случилось с:

System.IO.File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location);

Ответ 5

Это должно работать:

var entryAssembly = Assembly.GetEntryAssembly();
var fileInfo = new FileInfo(entryAssembly.Location);
var buildDate = fileInfo.LastWriteTime;

Ответ 6

Лучший способ сделать это - создать пользовательский атрибут, который вы установите на PreBuild вашей сборки.

И затем используйте стандартное отражение, чтобы получить созданный вами атрибут.

Но из любопытства, зачем убивать приложение после даты BUILD?

Ответ 7

Если вы пишете приложение для мобильного устройства с использованием компактной каркасной сборки, Assembly.Location недоступен.

Здесь, я нашел альтернативу:

     System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)