2009-08-20 55 views
13

C#中是否有等效的__DATE____TIME__C#中__DATE__,__TIME__宏的等价物#

基本上我想要做的是在C#应用程序中放置一些构建时间戳。

One possibility我看到微软的网站是要做到以下几点:“1.0

Assembly assem = Assembly.GetExecutingAssembly(); 
Version vers = assem.GetName().Version; 
DateTime buildDate = new DateTime(2000, 1, 1).AddDays(vers.Build).AddSeconds(vers.Revision * 2); 
Console.WriteLine(vers.ToString()); 
Console.WriteLine(buildDate.ToString()); 

但是,这只能如果你的版本的AssemblyInfo.cs是,这我们也不会。

回答

4

我建议自定义您的构建脚本以将日期时间写入文件。 MSBuild Community Tasks项目有一个时间任务,可以用于这一点。

+0

谢谢,这看起来像是最直接的插入方式某处的时间戳。 – 2009-08-21 17:17:30

+0

除插入时间戳外,还可以提取已插入的时间戳。请参阅http://stackoverflow.com/questions/1600962/displaying-the-build-date以获取代码以获取链接器放入的内容。在PE和COFF文件标题发生更改之前可能很好。 – 2015-11-10 17:49:34

2

如果你想自动生成您的构建和版本号,我会考虑以下项目在CodePlex上:

http://autobuildversion.codeplex.com/

+0

我不想生成版本号,因为我们已经有一个预先存在的约定来坚持。只是想在应用程序的某处嵌入编译时间。 – 2009-08-20 22:48:32

+0

出于好奇,为什么你需要嵌入的构建时间? – jrista 2009-08-20 23:46:50

+0

没有任何真正的原因,我经常发现打印出某种打印时间非常方便,因为我们的版本号不会与我们制作的每个版本冲突。 – 2009-08-21 17:14:11

1

你可以看看定制的.csproj文件中的项目。这只是一个普通的msbuild文件,您可以挂钩到BeforeBuild目标中来生成或更新文件,也许可以将此值存储在自定义程序集级属性中。

我想象一下msbuild社区任务在这里会很有用,因为他们有一些有用的任务,例如文件中的令牌替换。

0

丑陋,并且需要一定的权限,但如果这是供内部使用:

  // assume the relevant using statements above... 
      FileVersionInfo vi = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location); 
      FileInfo fileInfo = new System.IO.FileInfo(vi.FileName); 
      DateTime createTime = fileInfo.CreationTime; 
0

日期时间DATE = File.GetLastWriteTime(Application.ExecutablePath);

1

简短回答:。没有相应的东西。他们离开了它。太糟糕了。跟你开玩笑。

有一些近乎相当的变通,都基于程序检查自己。没有一个是理性的,优雅的或坚固的。

某些解决方案从“AssemblyVersion”中获取编译日期+时间,该编译日期是四个UInt16字段(“主要版本”,“次要版本”,“内部版本号”和“版本”)的结构,不保证以包含日期和时间在所有,更少以特定的格式。如果您将AssemblyVersion设置为“ab *”(并且没有人更改它),那么编译器会将其覆盖为abcd,其中c = 2000天,d * 2 = 2000年1月1日00:00(当地时间) ,但忽略夏令时),目前它解析AssemblyInfo.cs。这些被编译到程序中,可以通过System.Reflection.Assembly.GetExecutingAssembly()。GetName()。Version来访问它们。

其他解决方案具有可执行文件到达到文件系统从自己的元数据,这是很容易被转移通过FAT,CDFS,或FTP与改变或损坏拿起它的“最后修改”日期+时间DST或时区更改,直接放弃元数据的惰性FTP服务器或根据请求更改元数据的文件实用程序。青衫。

编译时常量(或常量),可能被称为#NOW(或#YEAR,#MONTH,#DAY等),可以在表达式中使用或分配给const或a只读? CodeWarrior C,GCC,MS C和MS C++提供标准的预定义宏__DATE____TIME__,它们可以像编译时字符串常量一样使用。这看起来像是C#中的一个明显遗漏,它让每个人都浪费人物年,询问和设置解决方法。新的语言,新的代码,可悲的摇摇晃晃的设计。 C#没有宏。 C#的#define只有“已定义”或“未定义”。所以呢?我没有理由删除重要的编译时常量。把它放入C#的假专业处理器怎么样?

17年后进入“简单管理C”/“类C面向对象语言”,CIL和CLR,这是什么?一百万种编写代码的方式不符合它的要求(线程的实现)?揭露“底层方法”的每一个缺陷的图书馆?您必须针对一个(或两个)两个单独的虚拟机:32位硬件(或仿真器)的32位虚拟机和64位硬件的64位虚拟机(仅限于) - 虚拟机? Java编译一次,仅为一个虚拟机,当然每个平台(32或64)都有单独的实现。