Как получить дату последнего изменения сборки?
Я хочу отобразить (для внутренней отладки / информации) дату последнего изменения сборки, поэтому я буду знать, когда был развернут определенный веб-сайт.
Возможно ли получить это через отражение?
Я получаю версию как это:
Assembly.GetExecutingAssembly().GetName().Version.ToString();
Я ищу что-то похожее - я не хочу открывать физический файл, получать его свойства или что-то в этом роде, так как я буду рендерить его на главной странице, и не хочу таких накладных расходов,
6 ответов
Я второй ответ Пирания:
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;
Некоторые люди думают, что 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' в ваших ресурсах.
Я взял оба ответа на этот вопрос
RetrieveLinkerTimestamp
Решение не будет работать после года 2038
сборы за использование int32
от 1970
, Я предлагаю использовать следующее (хотя это, вероятно, также имеет свои ограничения):
IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)
Я не верю, что сборка содержит последнюю измененную информацию, так как это атрибут операционной системы. Я считаю, что единственный способ получить эту информацию - через дескриптор файла.