Эквивалент макросов __DATE__, __TIME__ в C # - PullRequest
14 голосов
/ 21 августа 2009

Есть ли в C # эквивалент __DATE__ и __TIME__?

По сути, я пытаюсь поместить временную метку сборки в приложение C #.

Одна из возможностей , которую я увидел на веб-сайте Microsoft, заключалась в следующем:

Assembly assem = Assembly.GetExecutingAssembly();
Version vers = assem.GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1).AddDays(vers.Build).AddSeconds(vers.Revision * 2);
Console.WriteLine(vers.ToString());
Console.WriteLine(buildDate.ToString());

Однако это работает только в том случае, если ваша версия в AssemblyInfo.cs имеет значение "1.0. . ", а наша не будет.

Ответы [ 6 ]

4 голосов
/ 21 августа 2009

Я рекомендую настроить скрипт сборки, чтобы записать дату и время в файл. Проект MSBuild Community Tasks имеет задачу Time, которую можно использовать именно для этого.

2 голосов
/ 05 ноября 2016

Краткий ответ: NO . Там нет эквивалента. Они оставили это. Очень плохо. Шутка о тебе.

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

Некоторые решения выбирают дату и время компиляции из «AssemblyVersion», структуры из четырех полей UInt16 («Основная версия», «Малая версия», «Номер сборки» и «Редакция»), которые не являются гарантированно будет содержать дату и время , а тем более в определенном формате. Если для AssemblyVersion установлено значение «ab *» (и никто его не изменяет), то компилятор переопределяет его на abcd, где c == days и d * 2 == секунд с 1 января 2000 года в 00:00 (по местному времени). , но не учитывает переход на летнее время), в данный момент он анализирует AssemblyInfo.cs. Они скомпилированы в программу, где к ним можно получить доступ через System.Reflection.Assembly.GetExecutingAssembly (). GetName (). Version.

Другие решения имеют доступ к исполняемому файлу в файловой системе, чтобы получить его "дату последнего изменения" + время из его собственных метаданных , которые легко изменяются или повреждаются при передаче через FAT, CDFS, или FTP с DST или изменениями часового пояса, ленивыми FTP-серверами, которые напрямую отбрасывают метаданные, или файловыми утилитами, которые изменяют метаданные по запросу. Жалкие.

Где находится постоянная времени компиляции (или константы), которая может называться #NOW (или #YEAR, #MONTH, #DAY и т. Д.), Которая может использоваться в выражениях или присваиваться const или только для чтения? CodeWarrior C, GCC, MS C и MS C ++ предоставляют стандартные предопределенные макросы __DATE__ и __TIME__, которые можно использовать как строковые константы времени компиляции. Кажется, это явное упущение в C #, заставляющее каждого тратить впустую человеческие годы, спрашивая и создавая обходные пути. Новый язык, новый код, жалкий шаткий дизайн. C # не имеет макросов. #Define в C # имеет только «определен» или «не определен». И ЧТО? Я не вижу оправдания для удаления значительных констант времени компиляции. Как насчет того, чтобы поместить его в поддельный про-процессор C #?

17 лет в "Simple Managed C" / "C-like Object-Oriented Language", CIL и CLR, и это что такое? Миллион способов написания кода, который не выполняет то, что говорит (реализация потоков)? Библиотеки, которые разоблачают все недостатки «основного метода»? Вы должны выбрать одну (или обе) из двух отдельных виртуальных машин : 32-разрядную виртуальную машину для 32-разрядного оборудования (или эмулятора) и 64-разрядную виртуальную машину для 64-разрядного оборудования (только) - что в этом виртуального? Java компилируется один раз, только для одной виртуальной машины, которая, конечно, имеет отдельные реализации для каждой платформы (32 или 64).

2 голосов
/ 21 августа 2009

Если вы пытаетесь автоматически сгенерировать ваши номера сборки и ревизии, я бы посмотрел следующий проект на CodePlex:

http://autobuildversion.codeplex.com/

1 голос
/ 21 августа 2009

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

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

0 голосов
/ 01 октября 2012

DateTime DATE = File.GetLastWriteTime (Application.ExecutablePath);

0 голосов
/ 30 ноября 2009

Безобразно и требует определенных разрешений, но если это для внутреннего использования:

            // assume the relevant using statements above...
            FileVersionInfo vi = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
            FileInfo fileInfo = new System.IO.FileInfo(vi.FileName);
            DateTime createTime = fileInfo.CreationTime;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...