В make-файлах для программ на C обычно можно увидеть что-то вроде этого:
echo char * gBuildSig ="%DATE% %TIME%"; > BuildTimestamp.c
И затем полученный исходный файл C компилируется в изображение. Вышеописанное работает в Windows, потому что переменные% date% и% time% известны в cmd.exe, но аналогичная вещь будет работать в Unix с использованием cat.
Вы можете сделать то же самое, используя C #. Еще раз, это будет выглядеть так, если вы используете make-файл. Вам нужен класс и публичное статическое свойство.
BuildTimestamp.cs:
echo public static class Build { public static string Timestamp = "%DATE% %TIME%";} > BuildTimestamp.cs
И затем для вещи, которую вы строите, зависимость и удаление:
MyApp.exe: BuildTimestamp.cs MyApp.cs
$(_CSC) /target:exe /debug+ /optimize- /r:System.dll /out:MyApp.exe MyApp.cs BuildTimestamp.cs
-del BuildTimestamp.cs
Обязательно удалите файл BuildTimestamp.cs после его компиляции; Вы не хотите использовать это снова. Затем, в вашем приложении, просто сослаться на Build.Timestamp.
Используя MSBuild или Visual Studio, это сложнее. Я не могу получить% date% или% time% для разрешения. Эти вещи являются псевдо-переменными среды, я думаю, именно поэтому. Поэтому я прибег к косвенному способу получения метки времени, используя задачу Touch с AlwaysCreate = true. Это создает пустой файл. Следующий шаг записывает исходный код в тот же файл, ссылаясь на временную метку файла. Один поворот - мне пришлось избежать точки с запятой.
Ваш шаг перед сборкой должен создать цель "BuildTimestamp". И обязательно включите этот файл в компиляцию. И удалите его позже, на этапе после сборки.
<ItemGroup>
<StampFile Include="BuildTimestamp.cs"/>
</ItemGroup>
<Target Name="BuildTimestamp"
Outputs="@(StampFile)">
<Message Text="Building timestamp..." />
<Touch
AlwaysCreate="true"
Files="@(StampFile)" />
<WriteLinesToFile
File="@(StampFile)"
Lines='public static class Build { public static string Timestamp = "%(StampFile.CreatedTime)" %3B }'
Overwrite="true" />
</Target>