Получение даты сборки.NET
Как я могу получить дату создания из текущей сборки.NET?
Я хотел бы добавить некоторые действительно простые функции, когда мое приложение перестает работать через неделю после даты сборки основной сборки. Я уже написал код, который убивает мое приложение после определенной даты. Мне просто нужно программно получить дату создания из сборки.
7 ответов
Я не думаю, что сама сборка содержит дату создания. Я подозреваю, что самое близкое, что вы можете получить - это дата создания самого файла сборки:
File.GetCreationTime(Assembly.GetExecutingAssembly().Location)
должен сделать свое дело.
РЕДАКТИРОВАТЬ:
Я думаю, что решение Джеффа Этвуда, написанное "гранатой" в этой теме, вероятно, является лучшим способом пойти сейчас.
Следующее основано на: 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);
}
}
Что случилось с:
System.IO.File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location);
Это должно работать:
var entryAssembly = Assembly.GetEntryAssembly();
var fileInfo = new FileInfo(entryAssembly.Location);
var buildDate = fileInfo.LastWriteTime;
Лучший способ сделать это - использовать пользовательский атрибут, который вы установили на PreBuild
вашей сборки.
А затем используйте стандартное отражение, чтобы получить атрибут, который вы создали.
Но из любопытства, зачем убивать приложение после даты BUILD?
Если вы пишете приложение для мобильного устройства, используя компактную рамку, Assembly.Location недоступна.
Здесь я нашел альтернативу:
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)