В настоящее время у меня есть приложение, отображающее номер сборки в окне заголовка. Это хорошо, за исключением того, что это ничего не значит для большинства пользователей, которые хотят знать, есть ли у них последняя сборка - они склонны называть ее «прошлой четвергой», а не сборкой 1.0.8.4321.
План состоит в том, чтобы вместо этого указать дату сборки - например, «Приложение построено 21/10/2009».
Я изо всех сил пытаюсь найти программный способ вытащить дату сборки в виде текстовой строки для использования, как это.
Для номера сборки я использовал:
Assembly.GetExecutingAssembly().GetName().Version.ToString()
после определения, как они возникли.
Я хотел бы что-то подобное для даты компиляции (и время, для бонусных баллов).
Здесь очень ценятся указатели (извините за каламбур, если это уместно) или более аккуратные решения ...
источник
Ответы:
Джеффу Этвуду было что сказать по этому поводу в « Определении даты сборки» .
Оказывается, наиболее надежным методом является получение метки времени компоновщика из PE-заголовка, встроенного в исполняемый файл, - некоторый код C # (Джо Спиви) для этого из комментариев к статье Джеффа:
Пример использования:
ОБНОВЛЕНИЕ: метод работал для .Net Core 1.0, но перестал работать после выпуска .Net Core 1.1 (дает случайные годы в диапазоне 1900-2020)
источник
.AddHours()
довольно хакерская и (я думаю) не будет принимать во внимание DST. Если вы хотите это по местному времени, вы должны использоватьdt.ToLocalTime();
вместо этого чистящее средство. Средняя часть также может быть значительно упрощена с помощьюusing()
блока.Добавьте ниже, чтобы предварительно построить командную строку события:
Добавьте этот файл в качестве ресурса, теперь у вас есть строка 'BuildDate' в ваших ресурсах.
Для создания ресурсов см. Как создавать и использовать ресурсы в .NET .
источник
Способ
Как указано @ c00000fd в комментариях . Microsoft меняет это. И хотя многие люди не используют последнюю версию своего компилятора, я подозреваю, что это изменение делает этот подход, безусловно, плохим. И хотя это забавное упражнение, я бы порекомендовал людям просто встраивать дату сборки в свой бинарный файл любым другим необходимым способом, если важно отслеживать дату сборки самого бинарного файла.
Это можно сделать с помощью некоторой тривиальной генерации кода, которая, вероятно, уже является первым шагом в вашем скрипте сборки. Это и тот факт, что инструменты ALM / Build / DevOps очень помогают в этом и должны быть предпочтительнее всего остального.
Я оставляю остальную часть этого ответа здесь только в исторических целях.
Новый путь
Я передумал об этом, и в настоящее время использую этот трюк, чтобы получить правильную дату сборки.
По старому
Ну, как вы генерируете номера сборки? Visual Studio (или компилятор C #) фактически предоставляет номера автоматической сборки и ревизии, если вы измените атрибут AssemblyVersion на, например:
1.0.*
Что произойдет, так это то, что сборка будет равна количеству дней с 1 января 2000 года по местному времени, а пересмотр будет равен числу секунд с полуночи по местному времени, деленному на 2.
см. контент сообщества, номера автоматической сборки и ревизии
например AssemblyInfo.cs
SampleCode.cs
источник
TimeZone.CurrentTimeZone.IsDaylightSavingTime(buildDateTime) == true
IMAGE_FILE_HEADER::TimeDateStamp
поле имеет случайное число и больше не является отметкой времени.Добавьте ниже, чтобы предварительно построить командную строку события:
Добавьте этот файл в качестве ресурса, теперь у вас есть строка 'BuildDate' в ваших ресурсах.
После вставки файла в ресурс (в виде открытого текстового файла) я получил к нему доступ через
Для создания ресурсов см. Как создавать и использовать ресурсы в .NET .
источник
Один из подходов, о котором я удивляюсь, еще никто не упомянул, - это использовать текстовые шаблоны T4 для генерации кода.
Плюсы:
Минусы:
источник
Constants.CompilationTimestampUtc
. Если VS не генерирует файл C # с классом, то вам нужно выяснить, как заставить его это сделать, но ответ зависит (как минимум) от версии VS и типа файла csproj, поэтому слишком много деталей для этого поста.Что касается техники извлечения информации о дате / версии сборки из байтов PE-заголовка сборки, Microsoft изменила параметры сборки по умолчанию, начиная с Visual Studio 15.4. Новое значение по умолчанию включает детерминированную компиляцию, которая делает действительную временную метку и автоматически увеличивающиеся номера версий ушедшими в прошлое. Поле метки времени все еще присутствует, но оно заполняется постоянным значением, которое является хешем того или иного, но не указанием времени сборки.
Некоторые подробные сведения здесь
Для тех, кто отдает предпочтение временной метке над детерминированной компиляцией, есть способ переопределить новое значение по умолчанию. Вы можете включить тег в файл .csproj интересующей сборки следующим образом:
Обновление: я поддерживаю решение текстового шаблона T4, описанное в другом ответе здесь. Я использовал это, чтобы решить мою проблему чисто, не теряя преимущества детерминированной компиляции. Одно предостережение по этому поводу заключается в том, что Visual Studio запускает компилятор T4 только при сохранении файла .tt, а не во время сборки. Это может быть неудобно, если вы исключите результат .cs из управления исходным кодом (поскольку вы ожидаете, что он будет сгенерирован), а другой разработчик проверит код. Без сохранения у них не будет файла .cs. В nuget есть пакет (который называется AutoT4), который делает компиляцию T4 частью каждой сборки. Я еще не сталкивался с решением этой проблемы во время развертывания производства, но я ожидаю, что что-то подобное сделает это правильно.
источник
Я просто новичок в C #, поэтому, возможно, мой ответ звучит глупо - я отображаю дату сборки с даты, когда исполняемый файл был последний раз записан:
Я попытался использовать метод File.GetCreationTime, но получил странные результаты: дата из команды была 2012-05-29, но дата из Window Explorer показала 2012-05-23. После поиска этого несоответствия я обнаружил, что файл, вероятно, был создан 2012-05-23 (как показано в проводнике Windows), но скопирован в текущую папку 2012-05-29 (как показано командой File.GetCreationTime) - так чтобы быть на безопасной стороне, я использую команду File.GetLastWriteTime.
ZAlek
источник
LastWriteTime
, так как это точно отражает время, когда исполняемый файл был фактически обновлен.Здесь много хороших ответов, но я чувствую, что могу добавить свой из-за простоты, производительности (по сравнению с решениями, связанными с ресурсами), кроссплатформенности (также работает с Net Core) и отказа от любого стороннего инструмента. Просто добавьте эту цель msbuild в csproj.
и теперь у вас есть
Builtin.CompileTime
илиnew DateTime(Builtin.CompileTime, DateTimeKind.Utc)
если вам это нужно таким образом.ReSharper это не понравится. Вы можете игнорировать его или добавить частичный класс в проект, но он все равно работает.
источник
Builtin.CompileTime
из вида Razor.BeforeTargets="RazorCoreCompile"
но только тогда, когда это в том же проектеДля проектов .NET Core я адаптировал ответ Postlagerkarte, чтобы обновить поле Copyright для сборки, указав дату сборки.
Прямое редактирование csproj
Следующее может быть добавлено непосредственно к первому
PropertyGroup
в csproj:Альтернатива: свойства проекта Visual Studio
Или вставьте внутреннее выражение непосредственно в поле Copyright в разделе Package свойств проекта в Visual Studio:
Это может немного сбивать с толку, потому что Visual Studio оценит выражение и отобразит текущее значение в окне, но также соответствующим образом обновит файл проекта за кулисами.
Комплексное решение через Directory.Build.props
Вы можете поместить
<Copyright>
вышеуказанный элемент вDirectory.Build.props
файл в корне вашего решения и автоматически применить его ко всем проектам в каталоге, предполагая, что каждый проект не имеет своего значения авторского права.Directory.Build.props: настроить сборку
Вывод
Пример выражения даст вам авторское право, подобное этому:
поиск
Вы можете просмотреть информацию об авторских правах в свойствах файла в Windows или получить ее во время выполнения:
источник
Вышеупомянутый метод может быть настроен для сборок, уже загруженных в процессе , используя изображение файла в памяти (в отличие от повторного чтения его из хранилища):
источник
Для тех, кому нужно время компиляции в Windows 8 / Windows Phone 8:
Для тех, кому нужно время компиляции в Windows Phone 7:
ПРИМЕЧАНИЕ. Во всех случаях вы работаете в «песочнице», поэтому вы сможете получить только время компиляции сборок, которые вы развернете вместе с приложением. (т.е. это не будет работать ни на чем в GAC).
источник
var assembly = typeof (AnyTypeInYourAssembly).GetTypeInfo().Assembly;
В 2018 году некоторые из вышеперечисленных решений больше не работают или не работают с .NET Core.
Я использую следующий подход, который прост и работает для моего проекта .NET Core 2.0.
Добавьте следующее в ваш .csproj внутри PropertyGroup:
Это определяет PropertyFunction, к которой вы можете получить доступ в вашей команде pre build.
Ваша предварительная сборка выглядит так
Установите свойство BuildTimeStamp.txt для встроенного ресурса.
Теперь вы можете прочитать отметку времени, как это
источник
"$(ProjectDir)BuildTimeStamp.txt"
), или она сломается, если в именах папок будут пробелы.$([System.DateTime]::Now.tostring("MM/dd/yyyy HH:mm:ss"))
вместо$([System.DateTime]::Now)
Опция, не обсуждаемая здесь, заключается в вставке ваших собственных данных в AssemblyInfo.cs, поле «AssemblyInformationalVersion» кажется подходящим - у нас есть несколько проектов, в которых мы выполняли нечто подобное в качестве шага сборки (однако я не совсем доволен способ, который работает, так что на самом деле не хочу воспроизводить то, что у нас есть).
Есть статья на эту тему по codeproject: http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx
источник
Мне нужно было универсальное решение, которое работало бы с проектом NETStandard на любой платформе (iOS, Android и Windows). Для этого я решил автоматически сгенерировать файл CS с помощью скрипта PowerShell. Вот скрипт PowerShell:
Сохраните файл PowerScript как GenBuildDate.ps1 и добавьте его в свой проект. Наконец, добавьте следующую строку в событие Pre-Build:
Убедитесь, что BuildDate.cs включен в ваш проект. Работает как чемпион на любой ОС!
источник
Я просто:
источник
Вы можете использовать этот проект: https://github.com/dwcullop/BuildInfo
Он использует T4 для автоматизации метки времени сборки. Существует несколько версий (разных веток), в том числе одна, которая дает вам Git Hash ветки, которую вы в данный момент извлекли, если вы любите подобные вещи.
Раскрытие: я написал модуль.
источник
Другой, дружественный к PCL подход заключается в использовании встроенной задачи MSBuild для замены времени сборки в строку, возвращаемую свойством приложения. Мы успешно используем этот подход в приложении с проектами Xamarin.Forms, Xamarin.Android и Xamarin.iOS.
РЕДАКТИРОВАТЬ:
Упрощается путем перемещения всей логики в
SetBuildDate.targets
файл и использованияRegex
вместо простой замены строк, чтобы файл мог быть изменен каждой сборкой без «перезагрузки».Определение встроенной задачи MSBuild (для этого примера сохранено в файле SetBuildDate.targets, локальном для проекта Xamarin.Forms):
Вызов указанной выше встроенной задачи в файле Xamarin.Forms csproj в target BeforeBuild:
FilePath
Свойство установлено вBuildMetadata.cs
файл в проекте Xamarin.Forms , который содержит простой класс со свойством строкиBuildDate
, в которой время сборки будет заменено:Добавьте этот файл
BuildMetadata.cs
в проект. Он будет изменяться при каждой сборке, но таким образом, чтобы допускались повторные сборки (повторные замены), так что вы можете включить или опустить его в управлении исходным кодом по желанию.источник
Вы можете использовать событие проекта после сборки, чтобы записать текстовый файл в целевой каталог с текущей датой и временем. Затем вы можете прочитать значение во время выполнения. Это немного глупо, но это должно сработать.
источник
Я не уверен, но, возможно, помогает Build Incrementer .
источник
Небольшое обновление ответа «Новый путь» от Джона.
Вам нужно построить путь вместо использования строки CodeBase при работе с ASP.NET/MVC
источник
Вы можете запустить дополнительный шаг в процессе сборки, который записывает отметку даты в файл, который затем может быть отображен.
На вкладке свойств проектов посмотрите вкладку событий сборки. Существует возможность выполнить команду до или после сборки.
источник
Я использовал предложение Абдуррахима. Однако, это, казалось, дало странный формат времени и также добавило сокращение для дня как часть даты сборки; пример: вс 12/24/2017 13: 21: 05.43. Мне нужна была только дата, поэтому мне пришлось удалить все остальное, используя подстроку.
После добавления
echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"
события перед сборкой я просто сделал следующее:Хорошая новость в том, что это сработало.
источник
Если это приложение для Windows, вы можете просто использовать путь к исполняемому файлу приложения: новый System.IO.FileInfo (Application.ExecutablePath) .LastWriteTime.ToString ("yyyy.MM.dd")
источник
возможно
Assembly execAssembly = Assembly.GetExecutingAssembly(); var creationTime = new FileInfo(execAssembly.Location).CreationTime; // "2019-09-08T14:29:12.2286642-04:00"
источник