相当于C#中的__DATE __,__ TIMME__宏

在C#中是否有__DATE____TIME__

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

我在微软网站上看到的一种可能性是做以下事情:

 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中的版本为“1.0 .. ”,而我们的版本不是。

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

如果您尝试自动生成构建版本和修订版本号,我将在CodePlex上查看以下项目:

http://autobuildversion.codeplex.com/

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

我认为msbuild社区任务在这里很有用,因为它们有一些有用的任务,比如文件中的令牌替换。

简答: 没有 。 没有等价物。 他们把它留了出来。 太糟糕了。 跟你开玩笑。

有一些接近等效的解决方案 ,都是基于程序检查自身。 没有一个是理性的,优雅的或坚固的。

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

其他解决方案将可执行文件扩展到文件系统中以从其自己的元数据中获取其“最后修改”日期+时间,这可通过使用DST或时区更改通过FAT,CDFS或FTP传输而轻易更改或损坏,完全丢弃元数据的懒惰FTP服务器,或根据请求更改元数据的文件实用程序。 青衫。

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

17年进入“简单管理C”/“C类面向对象语言”,CIL和CLR,这是什么? 有一百万种方法可以编写不符合要求的代码(执行线程)? 揭露“基础方法”的每个缺陷的库? 您必须针对两个独立虚拟机中的一个(或两个):32位VM(用于32位硬件(或仿真器))和64位VM(用于64位硬件(仅限)) – 虚拟内容是什么? Java仅为一个虚拟机编译一次,当然每个平台(32或64)都有单独的实现。

很丑,并且需要某些权限,但如果这是供内部使用:

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

DateTime DATE = File.GetLastWriteTime(Application.ExecutablePath);