Как я могу получить текущий DateTime от Предварительного компилятора в C#?

Для целей разработки я рекомендую вам использовать laravel dump-server , который выведет все значения на вашу консоль.

Вы также можете настроить его для экспорта информации в другой файл.

А для производственной цели, Monolog или любой лог-движок будет более уместным.

6
задан Reg Edit 14 August 2016 в 08:14
поделиться

7 ответов

C# не имеет понятия макросов; однако, можно использовать другие инструменты в сценарии сборки (csproj / NANT / и т.д.) для управления источником, прежде чем он скомпилирует. Я использую это, например, для определения номера пересмотра к текущему пересмотру SVN.

Дешевая опция является событием перед сборкой (можно сделать это через диалоговое окно свойств проекта в VS): по существу bat-файл, который работает перед сборкой; можно затем написать сценарий любых изменений, в которых Вы нуждаетесь. Более сложная опция является задачами сборки.

Например, служебная библиотека здесь включает a Time задача и a FileUpdate задача; это должно (в теории) быть возможным объединить два в цепочку вместе для эмуляции то, в чем Вы нуждаетесь.

Лично, я использовал бы [AssemblyVersion] детали, а не время - при соединении этого с системой управления исходным кодом это делает очень легким найти незаконную версию; таким образом для моей версии SVN, я затем использую (в моей сборке proj):

<!-- See http://msbuildtasks.tigris.org -->
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
  <Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
...
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />

И теперь моя версия блока корректна, включая версию файла, о которой сообщает ОС.

7
ответ дан 8 December 2019 в 14:48
поделиться

Можно получить его от самого dll (Источник: codinghorror)

   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;
    }
8
ответ дан 8 December 2019 в 14:48
поделиться

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

3
ответ дан 8 December 2019 в 14:48
поделиться

Я не думаю, что существует способ сделать это в C# - макроопределения стиля C++ являются запрещенным explictly.

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

0
ответ дан 8 December 2019 в 14:48
поделиться

Нет никакого препроцессора __TIME__ директива, но существуют другие вещи, которые Вы могли использовать, такие как время создания блока. Вы могли бы также рассмотреть использование замены ключевого слова от своей системы управления исходным кодом ($Date$ в подверсии).

0
ответ дан 8 December 2019 в 14:48
поделиться

Номер сборки может быть получен от метаданных блока и может быть установлен соответствовать дате сборки.

Обычно Вы найдете или создадите запись в файле AssemblyInfo.cs. Когда Ваш проект создается с помощью Visual Studio. Пример:

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

Кавычка для документации относительно AssemblyVersionAttribute. (Я имею полужирный некоторые важные части),

Можно указать все значения, или можно принять номер сборки по умолчанию, число пересмотра или обоих при помощи звездочки (). Например, [assembly:AssemblyVersion ("2.3.25.1")] указывает 2 как основная версия, 3 как вспомогательная версия, 25 как номер сборки, и 1 как число пересмотра. Номер версии такой как [assembly:AssemblyVersion ("1.2".)] указывает 1 как основная версия, 2 как вспомогательная версия, и принимает сборку по умолчанию и числа пересмотра. Номер версии такой как [assembly:AssemblyVersion ("1.2.15.*")] указывает 1 как основная версия, 2 как вспомогательная версия, 15 как номер сборки, и принимает число пересмотра по умолчанию. Номер сборки по умолчанию ежедневно увеличивает. Число пересмотра по умолчанию случайно.

Как Вы видите, если можно установить номер сборки по умолчанию с этим. Номер сборки по умолчанию является значением, которое увеличивается каждый день.

Можно затем получить Номер сборки при помощи AssemblyName. Свойство Version. Примеры, обеспеченные MSDN, должны получить Вас движение.

Номер сборки по умолчанию является количеством дней с 01.01.2000.

Этот вопрос также имеет четкое объяснение о том, как использовать это.

-1
ответ дан 8 December 2019 в 14:48
поделиться

Вы ищете что-то вроде этого:
(Получить дату сборки сборки через информацию о версии; номер сборки - дни с 1.1.2000)

         var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
        DateTime versionsDatum = new DateTime(2000, 1, 1);
        versionsDatum = versionsDatum.AddDays(version.Build);
-1
ответ дан 8 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: