Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在.net/C#应用程序中查找编译时的当前时间和日期?_C#_Build_Clr - Fatal编程技术网

如何在.net/C#应用程序中查找编译时的当前时间和日期?

如何在.net/C#应用程序中查找编译时的当前时间和日期?,c#,build,clr,C#,Build,Clr,我希望在.net应用程序中包含当前时间和日期,以便可以将其包含在启动日志中,向用户显示他们的版本。是否可以在编译期间检索当前时间,或者我必须获取可执行文件的创建/修改时间 例如 欢迎使用ApplicationX。这是在当时的年月日建造的 语言中没有任何东西可以做到这一点 您可以编写一个预构建步骤,将当前日期和时间写入源文件(例如,使用字符串文字,或作为源代码生成日期时间),然后将其编译为构建的一部分 我建议您使这个源文件尽可能简单,只包含这些信息。或者,它可以编辑现有的文件 有关此示例,请参见将

我希望在.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包含您要查找的信息(构建/版本等)。看看这是否适合您。

如果您对生成编号使用反射,则可以使用反射来确定编译生成的时间

程序集的版本信息由以下四个值组成:

  • 主要版本
  • 次要版本
  • 建筑编号
  • 修改
  • 您可以指定所有值,也可以使用星号(*)接受默认版本号和/或修订号。默认情况下,版本号和修订基于2000年1月1日

    以下属性将设置“主要”和“次要”,但随后会增加“内部版本号”和“修订”

    [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,但还没有尝试。