Ответ 1
Я рекомендую настроить вашу сборку script, чтобы записать дату в файл. В проекте MSBuild Community Tasks есть задача времени, которая может быть использована именно для этого.
Есть ли эквивалент __DATE__
и __TIME__
в С#?
В основном то, что я пытаюсь сделать, это разместить временную метку сборки в приложении С#.
Одна из возможностей, которую я видел на веб-сайте 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..", которой у нас не будет.
Я рекомендую настроить вашу сборку script, чтобы записать дату в файл. В проекте MSBuild Community Tasks есть задача времени, которая может быть использована именно для этого.
Если вы пытаетесь автогенерировать свои номера сборки и ревизии, я бы рассмотрел следующий проект в CodePlex:
Вы можете посмотреть, как настроить проекты .csproj файл. Это обычный файл msbuild, и вы можете подключаться к цели BeforeBuild для создания или обновления файла, возможно, сохраняя это значение в атрибуте пользовательского уровня сборки.
Я бы предположил, что задачи сообщества msbuild будут полезны здесь, поскольку у них есть несколько полезных задач для таких вещей, как замена токена в файле.
Короткий ответ: НЕТ. Нет эквивалента. Они оставили это. Очень жаль. Шутка на вас.
Есть несколько почти эквивалентных рабочих обходов, все они основаны на самой программе. Ни один из них не является рациональным, изящным или прочным.
Некоторые решения собирают дату компиляции + время из "AssemblyVersion", структуру из четырех полей UInt16 ( "Основная версия", "Незначительная версия", "Номер сборки" и "Редакция" ), которые не могут содержать дату и время на всех, а тем более в определенном формате. Если вы установите AssemblyVersion в "ab *" (и никто не изменит ее), компилятор переопределяет его на abcd, где c == days и d * 2 == секунды с 1 января 2000 года в 00:00 (по местному времени, но не учитывает летнее время), на данный момент он разбирает AssemblyInfo.cs. Они скомпилируются в программу, где к ним можно получить доступ через System.Reflection.Assembly.GetExecutingAssembly(). GetName(). Версия.
Другие решения имеют доступ к исполняемому файлу в файловую систему, чтобы получать свою "последнюю измененную" дату + время из своих собственных метаданных, которые легко изменяются или повреждаются путем передачи через FAT, CDFS или FTP с использованием DST или времени изменения зоны, ленивые FTP-серверы, которые полностью отбрасывают метаданные, или утилиты файлов, которые меняют метаданные по запросу. Жалкие.
Где константа времени компиляции (или константы), может быть вызвана #NOW (или #YEAR, #MONTH, #DAY и т.д.), которая может использоваться в выражениях или назначена константе или readonly? CodeWarrior C, GCC, MS C и MS С++ предоставляют стандартные предопределенные макросы __DATE__
и __TIME__
, которые могут использоваться как строковые константы компиляции. Похоже на явное упущение с С#, заставляя всех тратить человеко-лет, спрашивая и настраивая работу. Новый язык, новый код, жалкий шаткий дизайн. С# не имеет макросов. С# #define имеет только "определенный" или "undefined". И ЧТО? Я не вижу оправдания для удаления значительных констант времени компиляции. Как насчет того, чтобы поместить его в подпроцесс С#?
17 лет в "Простой управляемый C" / "C-подобный объектно-ориентированный язык", CIL и CLR, и это что это такое? Миллион способов написания кода, который не выполняет то, что он говорит (реализация потоковой передачи)? Библиотеки, которые раскрывают каждый недостаток "основного метода"? Вы должны настроить таргетинг на одну (или обе) две отдельные виртуальные машины: 32-разрядную виртуальную машину для 32-разрядного аппаратного обеспечения (или эмулятора) и 64-разрядную виртуальную машину для 64-разрядного оборудования (только) - что такое виртуальное? Java компилируется один раз для одной виртуальной машины, которая, конечно же, имеет отдельные реализации для каждой платформы (32 или 64).
Ужасно и требует определенных разрешений, но если это для внутреннего использования:
// 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;
DateTime DATE= File.GetLastWriteTime(Application.ExecutablePath);