如何在.net/C#应用程序中查找编译时的当前时间和日期?
我希望在.net应用程序中包含当前时间和日期,以便可以将其包含在启动日志中,向用户显示他们的版本。是否可以在编译期间检索当前时间,或者我必须获取可执行文件的创建/修改时间 例如 欢迎使用ApplicationX。这是在当时的年月日建造的如何在.net/C#应用程序中查找编译时的当前时间和日期?,c#,build,clr,C#,Build,Clr,我希望在.net应用程序中包含当前时间和日期,以便可以将其包含在启动日志中,向用户显示他们的版本。是否可以在编译期间检索当前时间,或者我必须获取可执行文件的创建/修改时间 例如 欢迎使用ApplicationX。这是在当时的年月日建造的 语言中没有任何东西可以做到这一点 您可以编写一个预构建步骤,将当前日期和时间写入源文件(例如,使用字符串文字,或作为源代码生成日期时间),然后将其编译为构建的一部分 我建议您使这个源文件尽可能简单,只包含这些信息。或者,它可以编辑现有的文件 有关此示例,请参见将
语言中没有任何东西可以做到这一点 您可以编写一个预构建步骤,将当前日期和时间写入源文件(例如,使用字符串文字,或作为源代码生成
日期时间
),然后将其编译为构建的一部分
我建议您使这个源文件尽可能简单,只包含这些信息。或者,它可以编辑现有的文件
有关此示例,请参见将当前SVN修订嵌入AssemblyFileVersion
属性的生成文件。构建文件的一些分类位:
<!-- See http://msbuildtasks.tigris.org -->
<Import
Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<!-- Find out what the latest version is -->
<SvnInfo RepositoryPath="$(SvnUrl)">
<Output TaskParameter="LastChangedRevision" PropertyName="Revision" />
</SvnInfo>
<!-- Update the AssemblyInfo with the revision number -->
<FileUpdate Files="$(OutputDirectory)\MiscUtil\MiscUtil\Properties\AssemblyInfo.cs"
Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
ReplacementText='$1.$2.$(Revision)$5' />
我所知道的做这件事的唯一方法有点复杂- 您可以有一个预构建事件来运行一个小应用程序,该应用程序可以动态生成源代码。一种简单的方法是只覆盖一个非常小的文件,其中包含一个类(或部分类),并将日/月/年硬编码为字符串常量
如果您将此设置为作为预生成事件运行,它将在每次生成之前重写该文件。您可以使用PostSharp在生成后立即编入日期。PostSharp提供了一个轻量级的面向方面编程库,但它可以通过多种方式扩展到您需要的任何内容。它在IL级别工作,但是API从中提取了一些内容
您可以在AssemblyInfo.cs中更新程序集版本,作为构建的一部分。然后你可以做这样的事情
FileVersionInfo lvar = FileVersionInfo.GetVersionInfo(FileName);
FileVersionInfo包含您要查找的信息(构建/版本等)。看看这是否适合您。如果您对生成编号使用反射,则可以使用反射来确定编译生成的时间 程序集的版本信息由以下四个值组成:
[assembly: AssemblyVersion("5.129.*")]
然后,您可以使用如下内容:
public static DateTime CompileTime
{
get
{
System.Version MyVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
// MyVersion.Build = days after 2000-01-01
// MyVersion.Revision*2 = seconds after 0-hour (NEVER daylight saving time)
DateTime compileTime = new DateTime(2000, 1, 1).AddDays(MyVersion.Build).AddSeconds(MyVersion.Revision * 2);
return compileTime;
}
}
在C程序的makefiles中,常见的情况如下:
echo char * gBuildSig ="%DATE% %TIME%"; > BuildTimestamp.c
然后将生成的C源文件编译到映像中。上述方法在Windows上有效,因为cmd.exe中已知%date%和%time%变量,但在使用cat的Unix上也可以使用类似的方法
你可以用C做同样的事情。同样,如果您使用的是makefile,它的外观也是这样。您需要一个类和一个公共静态属性
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或visualstudio,它更复杂。我无法获取%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>
嗨,我对同一个问题使用了以下方法
private DateTime ExecutableInfo()
{
System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath.Trim());
try
{
return fi.CreationTime;
}
catch (Exception ex)
{
throw ex;
}
finally
{
fi = null;
}
}
可能这个相关的问题有一个解决方案:你可以使用可以用来报告有关应用程序的一些事情,但是OP问如何获取构建日期和时间。谢谢,这就是我最终要做的。我写了一个小C#应用程序,可以作为预构建步骤运行。谢谢你对程序集的建议,但这比我需要的要复杂一点。将信息转储到源文件很好。我认为返回的日期是UTC。我目前正在VS2015中使用该日期。它返回localtime,但如果您计划在18:12(大约)之后生成构建,则必须将MinorRevision强制转换为ushort。为了处理DST,我将使用GetDaylightChanges,但还没有尝试。