首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从DateTime中的预编译器获得当前的C#?

如何从DateTime中的预编译器获得当前的C#?
EN

Stack Overflow用户
提问于 2009-01-07 07:49:07
回答 7查看 3.8K关注 0票数 7

在C# 3.0中,我有一个属性,它应该包含类的版本。版本号只是编译的日期和时间。现在,我有以下代码:

代码语言:javascript
复制
public DateTime Version
{
    get { return DateTime.UtcNow; }
}

显然,这是错误的,因为此属性返回当前日期和时间。所以,在编译时,预编译器可以打印打印 DateTime吗?,在本例中,我可以做一些类似于下面的操作。

代码语言:javascript
复制
public DateTime Version
{
    get { return new DateTime("PRECOMPILER DATE"); }
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-01-07 07:53:54

C#没有宏的概念;但是,您可以使用构建脚本中的其他工具(csproj / NANT / etc)在源代码编译之前对其进行操作。例如,我使用它将修订号设置为当前的SVN修订版。

一个廉价的选项是一个构建前事件(您可以通过VS中的项目属性对话框来实现这一点):本质上是在构建之前运行的bat文件;然后您可以编写所需的任何更改脚本。一个更复杂的选项是构建任务。

例如,实用程序库这里包括一个Time任务和一个FileUpdate任务;应该(理论上)可以将两者链接在一起,以模拟所需的内容。

就我个人而言,我会使用[AssemblyVersion]详细信息而不是时间--如果您将其链接到源代码管理系统,这将使查找违规版本变得非常容易;因此,对于我的SVN版本,我使用(在我的构建proj中):

代码语言:javascript
复制
<!-- See http://msbuildtasks.tigris.org -->
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
  <Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
...
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />
<FileUpdate Files="Path\To\My\AssemblyInfo.cs"
    Regex='(\[\s*assembly:\s*AssemblyFileVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='$1.$2.$(BuildRev)$5' />

现在我的程序集版本是正确的,包括操作系统报告的文件版本。

票数 7
EN

Stack Overflow用户

发布于 2009-01-07 08:31:45

您可以将其从dll本身(资料来源: codinghorror)中撤回。

代码语言:javascript
复制
   private DateTime RetrieveLinkerTimestamp() {
        string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
        const int c_PeHeaderOffset = 60;
        const int c_LinkerTimestampOffset = 8;
        byte[] b = new byte[2048];
        System.IO.Stream s = null;

        try {
            s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            s.Read(b, 0, 2048);
        } finally {
            if (s != null) {
                s.Close();
            }
        }

        int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
        int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
        DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
        dt = dt.AddSeconds(secondsSince1970);
        dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
        return dt;
    }
票数 8
EN

Stack Overflow用户

发布于 2009-01-07 07:58:45

__TIME__预处理器指令在C#中没有等效之处,您能做的最好的就是获取当前程序集并获得创建日期,它将包含编译时间。请参阅这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/419507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档