Вопрос

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

Можно ли получить это с помощью рефлексии?

Я получаю версию, подобную этой:

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

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

Это было полезно?

Решение

Я поддержу ответ Пирании:

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

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

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

Другие советы

Если вы задаете номера версий и сборок по умолчанию в 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);

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

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

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

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' в ваших ресурсах.

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

Тот Самый RetrieveLinkerTimestamp решение не будет работать по истечении года 2038 взносы за использование int32 От 1970.Я предлагаю использовать следующее (хотя это, вероятно, тоже имеет свои ограничения).:

IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top