Как я могу узнать дату последнего изменения сборки?

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

Можно ли получить это через отражение?

Я получаю такую ​​версию:

Assembly.GetExecutingAssembly().GetName().Version.ToString();

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


person juan    schedule 29.04.2009    source источник


Ответы (6)


Я второй ответ Пирании:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;

Но добавьте это:

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

person Clyde    schedule 29.04.2009
comment
Привет, я пробовал использовать этот код, но получаю ошибку определения местоположения. В моем случае местоположение становится нулевым ... итак, что мне делать? - person Jignesh.Raj; 23.04.2013
comment
@ Jignesh.Raj Обязательно проверьте if (assembly != null) { ... } и if (fileInfo != null) { ... }, чтобы уберечь себя от горя. - person Jesse Chisholm; 05.06.2018
comment
Это отлично работает до тех пор, пока вы не используете его на Xamarin Android в режиме RELEASE. Здесь он всегда возвращает 1 января 1601 года как дату. - person thomasgalliker; 17.12.2019

Если вы по умолчанию используете номера редакции и сборки в AssemblyInfo:

[assembly: AssemblyVersion("1.0.*")]

Вы можете получить приблизительную дату сборки с помощью:

Version version = typeof(MyType).Assembly.GetName().Version;
DateTime date = new DateTime(2000, 1, 1)
    .AddDays(version.Build)
    .AddSeconds(version.Revision * 2);
person Hallgrim    schedule 30.04.2009
comment
Ответ Халлгрима тоже хорошо работает. Просто убедитесь, что вы изменили версию сборки, а не версию файла (ой) - person ; 20.04.2010
comment
Будьте осторожны, если вы используете это в сборке SharePoint, в которой размещена веб-часть, поскольку SP покажет (пользователю) ошибку для веб-частей, которые были добавлены на страницу из сборки, номер версии которой с тех пор изменился. В противном случае это отличный ответ. - person lance; 12.03.2012

Как насчет этого?

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;
person Markus Nigbur    schedule 29.04.2009

Некоторые люди думают, что Assembly не хранит дату сборки, но вы знаете, в чем они ошибаются, вы можете получить временную метку компоновщика из PE-заголовок, встроенный в исполняемый файл, как показано ниже, может работать (я сам не тестировал код)

private DateTime RetrieveLinkerTimestamp()
{
    string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
    const int c_PeHeaderOffset = 60;
    const int c_LinkerTimestampOffset = 8;
    byte[] b = new byte[2048];
    System.IO.Stream 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();
        }
    }

    int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
    int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
    dt = dt.AddSeconds(secondsSince1970);
    dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
    return dt;
}

или если сборка ваша, лучше использовать следующий подход, простой и легкий

Добавьте ниже в командную строку события перед сборкой:

echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"

Добавьте этот файл в качестве ресурса, теперь у вас есть строка BuildDate в ваших ресурсах.

Я взял оба ответа из этого вопроса

person Mubashar    schedule 10.01.2014
comment
Ответ Получение даты сборки .NET содержит для него вспомогательный класс. - person Michael Freidgeim; 17.02.2017
comment
Спасибо за это! это был тот ответ, который я искал, так как могу получить эпоху следующей сборки! - person Eraniichan; 01.10.2020

Решение RetrieveLinkerTimestamp не будет работать после 2038 года из-за использования int32 из 1970. Я предлагаю использовать следующее (хотя, вероятно, и у этого есть свои ограничения):

IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)
person Joseph    schedule 01.02.2018

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

person Josh    schedule 29.04.2009