当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从C#中的预编译器获取当前的DateTime?》经验,为你挑选了2个好方法。

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

public DateTime Version
{
    get { return DateTime.UtcNow; }
}

显然,这是错误的,因为此属性返回当前日期和时间.那么,预编译器是否可以在编译时打印 DateTime?在这种情况下,我可以做类似于下面的事情.

public DateTime Version
{
    get { return new DateTime("PRECOMPILER DATE"); }
}

Stormenet.. 8

你可以从dll本身中检索它(来源:codinghorror)

   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;
    }


Marc Gravell.. 7

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

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

例如,这里的实用程序库包括Time任务和FileUpdate任务; 它(理论上)应该可以将两者联系起来以模仿你需要的东西.

就个人而言,我会使用[AssemblyVersion]详细信息而不是时间 - 如果将其链接到源控制系统,这使得查找违规版本变得非常容易; 所以对于我的SVN版本,我然后使用(在我的构建项目中):



...

  

...


现在我的汇编版本是正确的,包括操作系统报告的文件版本.



1> Stormenet..:

你可以从dll本身中检索它(来源:codinghorror)

   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;
    }



2> Marc Gravell..:

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

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

例如,这里的实用程序库包括Time任务和FileUpdate任务; 它(理论上)应该可以将两者联系起来以模仿你需要的东西.

就个人而言,我会使用[AssemblyVersion]详细信息而不是时间 - 如果将其链接到源控制系统,这使得查找违规版本变得非常容易; 所以对于我的SVN版本,我然后使用(在我的构建项目中):



...

  

...


现在我的汇编版本是正确的,包括操作系统报告的文件版本.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有